0%

每一个颜色索引值都有相关联的颜色显示(定义了相关的颜色和强度)。颜色显示可以用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

上一章中绘制的图像可以通过更改基元的属性来让绘制的图像发生变化。这些改变属性的函数如下示:

属性 函数
颜色索引 PGSCI
颜色显示 PGSCR, PGSCRN,和 PGSHLS.
线条类型 PGSLS
线条宽度 PGSLW
字符高度 PGSCH
字符字体 PGSCF
文本背景 PGSTBG
填充区域风格 PGSFS, PGSHS.

上述这些设置程序可以混杂使用。

一旦一个属性在适当的地方被调用后,这个属性会影响到后续的绘图,直到这个属性再次改变为止。

上述说明可以通过PGSxx用于设置新的属性,同样PGQxx用于查询基元的当前值,这样就可以在改变属性之前保存老的属性。

文字主要用来做一些标记注释或者标题。

比如使用pgtext、pgptext、pgmtxt等等。

##转义字符的含义

转义字符 解释
\u 开始一个上标或结束一个下标
\d 开始一个下标或结束一个上标 (记住\u和\d 必须成对出现)
\b 退格
\fn 正常字体
\fr 罗马字体
\fi 意大利字体
\fs 手写体
\ 反斜杠字符
\x 乘号×
. 居中点
\A 物理中埃 (Å)
\gx 希腊字母
\mn \mnn 图标记,参考附录
(nnnn) 如果其中一个n的后面不是数字或者),那么)可能会被忽略。这个用于表示一些特殊字符(数学符号、音乐符号、天文符号和地制图的符号),参考附录

代码测试如下:

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
/// > upper and lower font
cpgtext(1.0,1.0,"SHAO\\u2011\\d");
/// > backspace
cpgtext(1.0,2.0,"SHAO\\b");
/// > normal font
cpgtext(1.0,3.0,"\\fnSHAO");
/// > roma font
cpgtext(1.0,4.0,"\\frSHAO");
/// > italy font
cpgtext(1.0,5.0,"\\fiSHAO");
/// > hand writing font
cpgtext(1.0,6.0,"\\fsSHAO");
/// >
cpgtext(1.0,7.0,"\\\\x\\.\\A");

/// > Greek alphabet
/// > alpha/beta/gamma/delta/epsilon/zeta/eta/theta
/// > iota/kappa/lambda/mu/nu/xi/omicron/pi
/// > rho/sigma/tau/upsilon/phi/chi/psi/omega
cpgtext(1.0,8.0,"\\ga\\gA|\\gb\\gB|\\gg\\gG|\\gd\\gD|\\ge\\gE|\\gz\\gZ|\\gy\\gY|\\gh\\gH|");
cpgtext(1.0,9.0,"\\gi\\gI|\\gk\\gK|\\gl\\gL|\\gm\\gM|\\gn\\gN|\\gc\\gC|\\go\\gO|\\gp\\gP|");
cpgtext(1.0,10.0,"\\gr\\gR|\\gs\\gS|\\gt\\gT|\\gu\\gU|\\gf\\gF|\\gx\\gX|\\gq\\gQ|\\gw\\gW|");

cpgtext(5.0,1.0,"\\m1 \\m2 \\m3 \\m4 \\m5 \\m6 \\m7 \\m8 \\m9 \\m10");
cpgtext(5.0,2.0,"\\m11 \\m12 \\m13 \\m14 \\m15 \\m16 \\m17 \\m18 \\m19 \\m20");
cpgtext(5.0,3.0,"\\m21 \\m22 \\m23 \\m24 \\m25 \\m26 \\m27 \\m28 \\m29 \\m30 \\m31");
...

区域填充可以让程序员把任意多边形的内部进行着色或渲染。

主要函数为pgploy(画任意多边形)、pgrect(画简易矩形)、pgcirc(画圆)。

例如,用PGPLOT (10,nx,ny)作图如下:

1
2
3
4
5
6
7
8
9
//file shao_pgplot_area_fill.
float xs[11] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0};
float ys[11] = {0.0, 1.0, 4.0, 6.0, 8.0, 8.0, 7.0, 8.0, 6.0, 4.0, 0.0};

cpgpoly(11, xs, ys);

cpgrect(1.0, 9.0, 1.0, 8.0);

cpgcirc(5., 5., 5.);

图标记就是一些符号,例如·、○、■、×等符号。这些符号为了标记一些特殊的点。

我们可以调用pgpt1来绘制这些标记。

标记符号太多了,这里画了10个不同的标记。

1
2
3
4
5
6
/// @file shao_pgplot_graph_markers.c
for (j = 0; j < 10; j++) {
for (i = 0; i < 10; i++) {
cpgpt1(i * 1.0 +1.0, j * 1.0 + 1.0, i * 10 + j);
}
}

随便写了一个从1到10的标记如图所示。

不同的标记如下所示:

Graph Markers

绘制线条的函数为pgline。这个函数可以绘制一条或多条直线线段。这个函数的详细介绍参考索引

还有两个更基础的pgmove和pgdraw。这些主要应用于数控绘图机上,所以一般我们用模块化比较好的pgline。

Pgline线条可以有pgmove和pgdraw组合而成 。两者的转化如下所示:

(主要显示出两者转化的代码,全部的代码如最基础代码所示。)

实例如下:

1
2
3
cpgline(n, xr[1], yr[1]);
for (i = 2; i < n; i++)
cpgdraw(xr[i],yr[i]);

等效于

1
cpgline(n, xr, yr);

在视口边缘的基元可能要被剪裁掉。

由于默认显示的规则不同,所以四种基元被裁减掉的可能性如下:

  • 线条在与viewport的交叉处外被裁剪;
  • 如果图标记的中心在viewport边缘或者里面就会画出来,否则就裁剪掉;
  • 文字除非越过了view surface,一般都不会裁减掉;
  • 区域填充也是在 viewport的边缘裁减掉;

在上一章选定好我们的窗口和视口后,我们就可以开始作图了。

本章我们描述最基础的程序,叫做基元。基元就是可以画出图像的元素。

这里有四种不同的基元:

  • lines:线条
  • graph-markers:图标记
  • text:文字
  • area fill:区域填充

通过下面的函数:

1
2
PGBOX ('BCTN', 0.0, 0, 'BCNST', 0.0, 0)
CALL PGLAB ('Epoch', 'Flux Density (Jy)', 'Variation of 3C345 at 10.7 GHz')

来给图像做注解。

PGMTXT可以给视口中的任何一个点做注解。