0%

开始使用PGPLOT编程的第一步就是要选定输出的设备,函数为cpgbeg

函数cpgenv 开始一幅新的图片并且定义了变量的范围和图像的比例,cpgenv 也可以按照参数绘制指定的坐标轴,详细参考函数原型。

一般函数cpgenv 之后就开始调用cpglab来标记坐标轴以及整个图像的标题。

函数cpgpt用于绘制一个或多个点,详细参考函数原型。

函数cpgline用于绘制一条线,详细参考函数原型。

在结束绘图后调用函数cpgend,如果不结束可能会影响到后续的程序。

简介

本章主要介绍一些图像显示的位置和比例的控制问题。

在上一章的简单示例中,我们通过PGENV来自动的控制图像的位置和标记信息。但是,为了获得对位置和标记等的完全控制,我们还需要了解下述知识:

  • View Surface:视图面
  • Window:窗口
  • Viewport:视口

另外还有两个坐标系统:

  • World Coordinates:世界坐标系
  • Device Coordinates:设备坐标系

一个简单的PGPLOT图像或许只是描述了二维的两个变量之间的依赖关系。
一个典型的图像包括数据点(误差条、点标记或者块标记)、连接在一起的线条,或者理论模型的平滑曲线。另外还要加上坐标来指出刻度等信息。

程序员应该在矩形的笛卡尔坐标轴上描述出一些必要的信息。

当然,对于这样的坐标系有一定的弊端,只能描述浮点型数据。

对于x和y坐标系不同计量单位的图像,我们后面会有所介绍。比如横坐标为时间,纵坐标为流量密度的射电源图像。

在PGPLOT编程过程中选择世界坐标系作为默认设置。

1
PGPLOT maps a selected rectangular region of the world-coordinate space (termed the window) onto a specified rectangle (termed the viewport) on the view surface (the screen of an interactive display or a sheet of paper on a hardcopy plotter).

这一段比较重要,指出了上面我们提到的三个术语,这三个术语要搞搞清楚,后面对于一些子程序,会对不同的术语做出不同配置。我不做翻译。只可意会不可言传~ ^_^

通俗的理解,先指定view surface,可以是显示的图像或者保存的ps文件;然后设置viewport,这个就是方框内的图形,不包括注释;而window就是实际对应的数值信息,比如随着时间的流量信息。

一个图像程序第一件要做的事情就是告诉PGPLOT选择使用什么设备作为输出,前面我们也提到过,一共有两种不同的设备类型。

这个设备类型我们可以在pgbeg函数中提前确定,例如PGBEG (0, ‘plotfile.ps/PS’, 1, 1),就是输出文件名为plotfile.ps的ps类型文件。也可以使用“?“来输出时自行选择。

当然,在完成我们的绘图工作以后,调用cpgend来刷新输出结果是有必要的,就像C语言中malloc以后要调用free,以免引起内存泄露。

对于不同的输出设备,PGPLOT默认是有一些输出default设置的。比如ps输出,就会采用标准的18X5inches的景观模式。

如果你有自己的审美观,准备设置一些高级的输出,那么这是你可以调用pgpage(后面有详细介绍)来设定宽度、比例。

PGBEG的最后两个参数nx和ny,可以将窗口分割为nx*ny个小窗口,例如nx和ny均取3,那么将绘制出9副图片。

3x3

PGPLOT是个Fortran子程序库。

目前,由于不同语言之间的协议不同,在C或者C++中直接调用PGPLOT是比较困难的。

另外,c语言是传值调用的,而FORTRAN是按引用传递的。CPGPLOT 库包装了C和PGPLOT库,其中的函数屏蔽了不同系统的差别,提供了与系统无关的接口。

编写PGPLOT程序的时候,只需要在头文件中添加文件头cpgplot.h即可,其中包含了我们所需要调用的一些函数原型。

CPGPLOT库只能用在与ANSI C兼容的c编译器(可以解析C函数原型)。

PGPLOT是一个设备无关的画图软件包,常用于简单的科学计算做图。PGPLOT用Fortran语言,但可以在C、Perl、Phython、Ruby等语言中调用,支持PS、GIF、PNG等很多图形格式,可以运行在Linux, SunOS, Solaris, HPUX, AIX, Irix, and MacOS X/Darwin等操作系统。

PGPLOT由加州理工(California Institute of Technology)的Tim Pearson编写。Tim是加州理工天文系(Department of Astronomy)的助理教授,主要做射电、宇宙学方面的研究。

目前PGPLOT最新的版本是2001-02-26发布的5.2.2版。版权属于加州理工学院。PGPLOT不是开放软件,但可以免费用于非商业用途。

Linux下碰到的一些问题

如何解决warning: no newline at end of file?

今天写了一段代码, 是在Windows下编辑的, 保存后放在linux系统下编译.

gcc和cc都产生以下的警告:

1
a.h:1:2: warning: no newline at end of file

后来发现解决这个问题产生的原因是源文件的最后一行没有回车符造成的; 解决的办法很简单, 在最后一行敲一个回车, 然后保存, 重新编译.

Linux运行文件时报错 bash $’\r’ command not found

这个主要是跨平台的问题,在Windows下编写好的sh文件,丢到Linux下运行会报错:bash: $’\r’: command not found。这是因为Windows系统的文件换行使用的是\r\n,而Unix系统是\n,可以通过下面的方式解决:

通过dos2unix来进行文件转换

1
$ dos2unix filename.sh

或者使用vim打开文件,然后使用命令:set ff=unix,保存文件即可。

send-mail: fatal: parameter inet_interfaces: no local interface found for ::1

在Linux里面使用mail发送邮件的时候报错:

1
2
$ echo 'Title' | mail -s "TEST" mail@mail.com
$ send-mail: fatal: parameter inet_interfaces: no local interface found for ::1

解决方法如下:打开文件 /etc/postfix/main.cf,将原始内容

1
2
3
inet_interfaces = localhost

inet_protocols = all

修改为:

1
2
3
inet_interfaces = all

inet_protocols = all

然后重新启动就ok了,service postfix restart

bashrc每次都不自动导入

新建的用户发现每次都不能把各种环境变量导入进来,导致类似的命令都无法使用,后面发现是少了bash_profile文件,只需要新建该文件:

1
$ touch ~/.bash_profile

然后加上如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

保存退出重新登陆,顺利解决。

/lib64/libstdc++.so.6: version `CXXABI_1.3.8’ not found

这个问题出现在CentOS7上,编译一个软件的时候出现的,首先可以查看CXXABI可用的版本,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$ strings /usr/lib64/libstdc++.so.6 | grep 'CXXABI'
CXXABI_1.3
CXXABI_1.3.1
CXXABI_1.3.2
CXXABI_1.3.3
CXXABI_1.3.4
CXXABI_1.3.5
CXXABI_1.3.6
CXXABI_1.3.7
CXXABI_1.3.8
CXXABI_1.3.9
CXXABI_1.3.10
CXXABI_1.3.11
CXXABI_1.3.12
CXXABI_TM_1
CXXABI_FLOAT128
CXXABI_1.3
CXXABI_1.3.11
CXXABI_1.3.2
CXXABI_1.3.6
CXXABI_FLOAT128
CXXABI_1.3.12
CXXABI_1.3.9
CXXABI_1.3.1
CXXABI_1.3.5
CXXABI_1.3.8
CXXABI_1.3.4
CXXABI_TM_1
CXXABI_1.3.7
CXXABI_1.3.10
CXXABI_1.3.3

查看本机的其他关于libstdc的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ find / -name libstdc++.so.6
/var/lib/docker/overlay2/7929ef6fe4ed49351d40d41db72096133c8767d3f2aea01eab66040e38efba37/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/var/lib/docker/overlay2/39955c16316d10641ff5a9ed525094e7b29f0657e26332511c972b437c309598/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/var/lib/docker/overlay2/42fa5b2822ec5fd3837777e5b06583b6aeab9b48b2a3b168e99f9e3251084d27/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/var/lib/docker/overlay2/3732c1cb1021032bffa34a3858c00a3c33e4e67102eb7216412a5079ba6f4369/diff/usr/lib64/libstdc++.so.6
...
/var/lib/docker/overlay2/565aeb287ef033e4384a87fcc2f451c68db294e659124f6d772dcb1658470d8e/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/var/lib/docker/overlay2/hi35aa9ta0ij3t4x3k6br7gm6/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/var/lib/docker/overlay2/whqa9v6f82q5x1i2mxsh8fo08/diff/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/var/lib/snapd/snap/core/15419/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/var/lib/snapd/snap/core/15511/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/usr/lib/libstdc++.so.6
/usr/lib64/libstdc++.so.6
/home/oper/anaconda3/lib/libstdc++.so.6

解决的方法,很简单,且已经奏效,把anaconda里面比较新的做一个软连接到/usr/lib64即可解决,不过记得做好备份。