0%

在绘图过程中如果仅仅希望修改图像的部分属性,可以使用PGSAVE和PAUNSA来方便的实现。

PGSAVE保存当前的PGPLOT属性到一个私有存储区域。

这些属性可以由PAUNSA来恢复。

保存的属性包括:

  • 字符字体
  • 字符高度
  • 颜色索引值
  • 填充区域类型
  • 线条类型
  • 线条宽度
  • 绘图位置
  • 箭头类型
  • 阴影类型

颜色显示是不保存的

PS:在调用PGSAVE和PGUNSA的时候,两者一定是成对出现的。

有将近20个属性可以通过PGSAVE来保存。

例如:(下述为fortran代码)

1
2
3
4
5
6
7
8
9
* save current attributes
CALL PGSAVE
* change the attributes and draw something
CALL PGSLW(2)
CALL PGSCI(11)
CALL PGLINE(7, X, Y)
* 还原 the attributes
CALL PGUNSA
RETURN

PGPLOT中有一系列的获取属性函数用于在准备更改基元属性的时候保存旧的属性的函数。
比如:

  • PGQLW(LW) 用于获取线条宽度
  • PGQCI(CI) 用于获取颜色索引

详细参考附录

使用函数PGSFS修改。

填充区域类型有四种格式: solid (实心的,颜色填充整个区域), outline (轮廓的,只有轮廓被描绘), hatched (阴影线,有平行线条构成) or cross-hatched (交叉平行线,有两组交叉的平行线绘制线条s).

各种格式对应的数字代码为:

  • 1: solid (default),
    2: outline
    3: hatched,
    4: cross-hatched.

四种格式如图所示:

1
2
3
4
5
6
7
8
9
10
11
12
/// @file shao_pgplot_fillarea_style.c
cpgsfs(1);
cpgcirc(1., 1., 1.);

cpgsfs(2);
cpgcirc(1., 3., 1.);

cpgsfs(3);
cpgcirc(1., 5., 1.);

cpgsfs(4);
cpgcirc(1., 7., 1.);

Color Index

这个属性影响文本的显示。可以使用PGSTBG来设置。

文本可以使透明的或者不透明的。这个取决于他的属性值。

  • -1: 透明
    0 - 255: 不透明的。

例如如下类似代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/// @file shao_pgplot_text_background.c
cpgstbg(-1);
cpgtext(1,2,"Hello SHAO");

cpgstbg(1);
cpgtext(1,3,"Hello SHAO");

cpgstbg(10);
cpgtext(1,4,"Hello SHAO");

cpgstbg(50);
cpgtext(1,5,"Hello SHAO");

cpgstbg(100);
cpgtext(1,6,"Hello SHAO");

cpgstbg(150);
cpgtext(1,7,"Hello SHAO");

cpgstbg(200);
cpgtext(1,8,"Hello SHAO");

cpgstbg(250);
cpgtext(1,9,"Hello SHAO");

Color Index

字符字体只影响文本。

有四种字体可用,在前面也有过介绍了。

默认的第一种是最简单也是可以最快画出来的。如下:

  1. normal (simple) font (default),
  2. roman font,
  3. italic font,
  4. script font.

可以通过 PGSCF来改变字体。
例如:通过类似下面的代码,显示出四种字体

1
2
3
4
5
6
7
8
9
10
11
12
13
   //@file : shao_pgplot_character_font.c
cpgsch(3);
cpgscf(1);
cpgtext(0, 1, "Hello SHAO using normal font");

cpgscf(2);
cpgtext(0, 4, "Hello SHAO using roman font");

cpgscf(3);
cpgtext(0, 7, "Hello SHAO using italic font");

cpgscf(4);
cpgtext(0, 10, " Hello SHAO using script font");

Color Index

字符高度影响图标记和文本。

默认的字符高度为视图表面的1/40。

可以通过PGSCH来改变字符大小。

1
2
3
4
5
6
7
8
9
10
11
12
/// @file shao_pgplot_character_height.c
cpgsch(1);
cpgtext(1,2,"1. Hello SHAO");

cpgsch(2);
cpgtext(1,3,"2. Hello SHAO");

cpgsch(3);
cpgtext(1,4,"3. Hello SHAO");

cpgsch(10);
cpgtext(1,5,"10. Hello SHAO");

Character Height

线条宽度影响线条、图标记和文本。

可以通过PGSLW来设定线条宽度。

线条的宽度也是因设备而异的,不同的设备可能有不同的分辨率。但大部分的设备上都是的线条的单位宽度为0.005英寸(也就是0.13毫米). 默认宽度为1,最大的可能只为201。

分别对同一组数据进行绘图,

1
2
3
4
5
6
/// @file shao_pgplot_line_width.c
cpgslw(1);
cpgslw(5);
cpgslw(10);
cpgslw(15);
cpgslw(50);

Line Width

线条类型可以是实线、点画先、点线等。

可以通过函数PGSLS来改变。默认的线条类型是实心不间断的线。

下面描述了线条类型的种类:

  1. 实线
  2. 破折号组成的线long dashes,
  3. 划点划点线dash-dot-dash-dot,
  4. 点线dotted,
  5. 划点点点dash-dot-dot-dot.

例如调用PGSLS(1)、PGSLS(2)、PGSLS(3)、PGSLS(4)、PGSLS(5)的效果为(从上到下):

Line Type

每一个颜色索引值都有相关联的颜色显示(定义了相关的颜色和强度)。颜色显示可以用HLS或者RGB来表示:

  • HLS:Hue, Lightness, and Saturation—色度、亮度和饱和度(0<H<360,0.0<=LS<=1.0)
  • RGB:Red, Green, and Blue –红、绿、蓝(0.0<=RGB<=1.0)

默认 颜色显示

Color Index Color (H, L, S) (R, G, B)
0 Black (background) 0, 0.00, 0.00 0.00, 0.00, 0.00
1 White (default) 0, 1.00, 0.00 1.00, 1.00, 1.00
2 Red 120, 0.50, 1.00 1.00, 0.00, 0.00
3 Green 240, 0.50, 1.00 0.00, 1.00, 0.00
4 Blue 0, 0.50, 1.00 0.00, 0.00, 1.00
5 Cyan (Green + Blue) 300, 0.50, 1.00 0.00, 1.00, 1.00
6 Magenta (Red + Blue) 60, 0.50, 1.00 1.00, 0.00, 1.00
7 Yellow (Red + Green) 180, 0.50, 1.00 1.00, 1.00, 0.00
8 Red + Yellow (Orange) 150, 0.50, 1.00 1.00, 0.50, 0.00
9 Green + Yellow 210, 0.50, 1.00 0.50, 1.00, 0.00
10 Green + Cyan 270, 0.50, 1.00 0.00, 1.00, 0.50
11 Blue + Cyan 330, 0.50, 1.00 0.00, 0.50, 1.00
12 Blue + Magenta 30, 0.50, 1.00 0.50, 0.00, 1.00
13 Red + Magenta 90, 0.50, 1.00 1.00, 0.00, 0.50
14 Dark Gray 0, 0.33, 0.00 0.33, 0.33, 0.33
15 Light Gray 0, 0.66, 0.00 0.66, 0.66, 0.66
16–255 Undefined

设备一般分成三类颜色显示:

  • static color,颜色固定,不更改
  • pseudo-color,更新索引表,并更新颜色
  • direct color,更新后续绘制的颜色

在可以显示一系列强度的单色设备上,显示强度I与RGB的的关系如下所示:

1
I = 0.30 R + 0.59 G + 0.11 B

与美国国家电视系统委员会规定的美国彩色电视系统标准一样。

用三基色RGB设置颜色显示

1
PGSCR(2, 0.0, 1.0, 0.3)

用色彩饱和度HLS设置颜色显示

色彩饱和度HLS(Hue-Saturation-Lightness)

  • Hue为一个角度,红色为120°,绿色为240°,蓝色为0°(或360°).
  • Lightness 的范围从0.0(黑色)到1.0(白色)。
  • Saturation的范围从0.0(灰色)到1.0(纯色)。

当Hue为0.0的时候是与我们的颜色不相关的。

Examples H L S R G B
black any 0.0 0.0 0.0 0.0 0.0
white any 1.0 0.0 1.0 1.0 1.0
medium gray any 0.5 0.0 0.5 0.5 0.5
red 120 0.5 1.0 1.0 0.0 0.0
yellow 180 0.5 1.0 1.0 1.0 0.0
pink 120 0.7 0.8 0.94 0.46 0.46

通过名字设置颜色显示

第三种除了PGSCR、PGSHLS用于设置颜色显示的就是函数PGSCRN,PGSCRN通过名字来设置颜色。例如:

1
PGSCRN(2, 'MediumOrchid', IER)

预设值前景色和背景色

与设备相关的默认颜色显示可以通过修改环境变量来更改。

比如在UNIX操作系统中,可以通过:

1
2
export PGPLOT_FOREGROUND=black
export PGPLOT_BACKGROUND=white

或者更有创意的:

1
2
export PGPLOT_FOREGROUND=gold
export PGPLOT_FOREGROUND=slategrey

颜色索引值影响前面提到的所有基元,可以通过函数PGSCI和PGSCR修改。

设备的不同有主要一点就是在它们显示颜色的能力上。

一般而言,在大多数的硬拷贝设备上,默认的颜色搭配是白底黑字,但在大多数显像管设备上,默认的是黑底白(绿)字。

颜色可以通过一个整型的参数(索引值)来改变。

颜色索引1是默认的颜色,0是背景颜色。

可用的颜色数量主要取决于设备本身。就像在大多数的单色设备上,0、1是可用的,而对于一些显像管设备,可用的颜色标记可以从0到255。当然,有些单色设备还可以选择不同的亮度值(强度值)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/// @file shao_pgplot_color_index.c
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]);

cpgsci(2);
cpgpt(5, xs, ys, 9);

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

cpgsci(3);
cpgline(n,xr,yr);

Color Index