0%

PGPLOT 的一个示例程序

简介

PGPLOT典型的应用主要是一些已知测定点的描绘和理论曲线的比对。

这里给出一个简单的例子程序,画出5个数据点,理论曲线为y=x^2。

代码

代码如下所示:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**
* Copyright (c) 2010-2017, Guo Shaoguang
*
* All rights reserved.
*
* @file shao_pgplot_y=x2.c
* @author Guo Shaoguang
* @email sgguo@shao.ac.cn
* @date 2011.06.11
* @version v1.0
*
* @brief This file will y=x^2 using PGPLOT
*/

#include "../include/cpgplot.h"
#include <stdio.h>
#include <stdlib.h>

int main() {
int i;
static float xs[] = {1.0, 2.0, 3.0, 4.0, 5.0};
static float ys[] = {1.0, 4.0, 9.0, 16.0, 25.0};
float xr[100], yr[100];
int n = sizeof(xr) / sizeof(xr[0]);

printf("Now begin to plot ...\n");

/// 1. Enable the PGPLOT and setting the device
if (cpgbeg(0, "?", 1, 1) != 1)
return EXIT_FAILURE;

/// 2. Setting the axis of x and y including label
cpgenv(0.0, 10.0, 0.0, 20.0, 0, 1);
cpglab("(x)", "(y)", "y = x\\u2\\d");
cpgiden();

/// 3. Begin plot points / lines
cpgpt(5, xs, ys, 9);

for (i = 0; i < n; i++) {
xr[i] = 0.1 * i;
yr[i] = xr[i] * xr[i];
}

cpgline(n,xr,yr);

/// 4. Close the PGPLOT
cpgend();

return EXIT_SUCCESS;
}

结果

Result

关于数据初始化就不多做解释了。

但凡对C语言有了解的人,应该和容易明白上述代码(除了PGPLOT调用子函数)。

开始使用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