线型、颜色和样式
在旧版的 gnuplot 中,每个终端类型都提供一组不同的“线型”,这些线型可能有不同的颜色、宽度、点/线图案及其组合。这些颜色和图案不能保证在不同的终端类型中保持一致,尽管大多数是用红/绿/蓝/洋红/青/黄颜色序列。通过命令set colorsequence classic
可以选择旧的行为,但是默认情况下,gnuplot 5 版使用一组终端无关的 8 色序列。
你可以进一步在初始化文件或者交互式地自定义线型属性。参考set linetype。在分发包中提供了几个示范的初始化文件。
在设置终端类型之后,当前的线型属性可以通过test命令预览。
单个命令的连续函数或数据文件绘制将按默认序列分配连续的线型。你可以在绘图命令中明确指定线条属性来覆盖。
示例 1
plot "foo", "bar" # 用线型 1, 2 绘制两个文件
plot sin(x) linetype 4 # 使用 4 号线型
通常,可以使用命名颜色、rgb (红、绿、蓝) 分量、hsv (色调、饱和度、值) 分量或者当前 pm3d 调色板坐标来指定颜色。
示例 2
plot sin(x) lt rgb "violet" # gnuplot 的命名颜色
plot sin(x) lt rgb "#FF00FF" # 十六进制的 RGB 对
plot sin(x) lt palette cb -45 # 当前调色板范围内对应于 -45 的颜色
plot sin(x) lt palette frac 0.3 # 沿着调色板的小数值
参考colorspec,show colornames,hsv,set palette,cbrange。参考set monochrome。
线型也有相关的点划线图案,虽然不是所有终端类型都能使用。Gnuplot 5 允许指定独立于线条颜色的点划线图案。参考dashtype。
colorspec
许多命令允许执行带显式颜色的线型。
语法
... {linecolor | lc} {"colorname" | <colorspec> | <n>}
... {textcolor | tc} {<colorspec> | {linetype | lt} <n>}
其中 <colorspec> 可以是下列形式:
rgbcolor "colorname" # 例如 "blue"
rgbcolor "0xRRGGBB" # 十六进制常量字符串
rgbcolor "0xAARRGGBB" # 十六进制常量字符串
rgbcolor "#RRGGBB" # x11 格式的十六进制常量字符串
rgbcolor "#AARRGGBB" # x11 格式的十六进制常量字符串
rgbcolor <integer val> # 整数值表示 AARRGGBB
rgbcolor variable # 整数值从输入文件读取
palette frac <val> # <val> 取值范围 0 到 1
palette cb <value> # <val> 在 cbrange 内
palette z
variable # 颜色索引从输入文件读取
bgnd # 背景颜色
black
"<n>" 是使用其颜色的线型编号。参考test。
"colorname" 是指 gnuplot 内置的颜色名称。用show colornames查看可用的颜色名称列表。
十六进制常量可以用括住的 "#RRGGBB" 或 "0xRRGGBB" 形式给出,其中 RRGGBB 代表颜色的红、绿、蓝分量,取值范围 00 到 FF。例如,品红 = 满量程红 + 满量程蓝,可以表示为 "0xFF00FF",即 (255 << 16) + (0 << 8) + (255) 的十六进制表示。
"#AARRGGBB" 表示高位重有 alpha 通道(透明度)的 RGB 颜色。alpha 值 0 表示完全不透明的颜色,即 "#00RRGGBB" 等同于 "#RRGGBB"。alpha 值 255 (FF) 表示完全透明。注意:alpha 通道的这种约定与早期版本的 gnuplot 中 "with rgbalpha" 影像图模式完全相反。
颜色调色板是一种线性的颜色渐变,可以将单个数值平滑地映射到特定颜色上。两个这样的映射总是有效的。palette frac将 0 和 1 之间的小数值映射到颜色调色板的整个范围上。palette cb将颜色轴的范围映射到相同的调色板上。参考set cbrange。也请参考set colorbox。两种方式都可以从当前调色板中选择颜色。
"palette z" 将每个绘图段或绘图元素的 z 值映射到调色板的 cbrange 映射中。这使得 3D 线条或表面具有平滑变化的颜色。也允许 2D 图从数据的额外列读取调色板值(并不是所有 2D 绘图样式都允许有额外的列)。有两种特殊的颜色说明符:bgnd用于背景颜色,以及black。
背景颜色
大多数终端允许你为图形设置一个明确的背景颜色。特殊的线型bgnd就绘制这个颜色,而且bgnd也被识别为一个颜色。例如:
# 擦除画布的一部分,在其中写入背景颜色
set term wxt background rgb "gray75"
set object 1 rectangle from x0,y0 to x1,y1 fillstyle solid fillcolor bgnd
# 沿着 x 轴绘制一条“不可见”的线条
plot 0 lt bgnd
可变线条颜色
lc variable告诉程序从输入数据的某一列读取数值作为线型索引,并使用属于该线型的颜色。这需要在using说明符指定额外的列。文本颜色可以类似地用tc variable设置。
示例
# 用第 3 列数据为每个点分别指定颜色
plot 'data' using 1:2:3 with points lc variable
# 一个数据文件可以包含多个数据集,由两个空行分隔。
# 每个数据集按索引值分配 (参考 `index`),
# 可以通过 `using` 说明符的 `column(-2)` 检索。
# 参考 `pseudocolumns`。本例用 -2 列的值,为每个数据集分配不同的线条颜色
plot 'data' using 1:2:(column(-2)) with lines lc variable
rgbcolor variable
你可以为图形中的每个数据点、线段或者标签分配单独的颜色。lc rgbcolor variable
告诉程序从数据文件读取 RGB 颜色信息。要求using说明符有相应的额外数据列。额外的列被解释为 24 位 RGB 三元组。如果该值直接在数据文件中提供,最简单的方法是将其作为十六进制值 (参考rgbcolor)。此外,using说明符可以包含一个表达式,其计算结果为 24 位 RGB 颜色,如下例所示。文本颜色也有类似的设置tc rgbcolor variable
。
示例
# 用数据点的 x,y,z 坐标计算对应的
# 红、绿、蓝颜色分量
rgb(r,g,b) = 65536 * int(r) + 256 * int(g) + int(b)
splot "data" using 1:2:3:(rgb($1,$2,$3)) with points lc rgb variable
dashtype
在 gnuplot 5 中,虚线图案 (dashtype) 是与每条线相关的单独属性,类似于linecolor或linewidth。没有必要将当前终端放在一个特殊模式以绘制虚线,即,命令set term <termname> {solid|dashed}
现在被忽略。如果需要向后兼容 4 版,可以使用下面的写法:
if (GPVAL_VERSION >= 5.0) set for [i=1:9] linetype i dashtype i
if (GPVAL_VERSION < 5.0) set termoption dashed
除非另有说明,否则所有线条都具有dashtype solid属性。你可以使用命令set linetype改变特性线型的默认值,使其影响后续所有命令,也可以在plot或其他命令中单独设置虚线。
语法
dashtype N # 按编号引用预定义的虚线
dashtype "pattern" # 包含点 (.) 短划线 (-) 下划线 (_) 和空格等
# 字符组合的字符串
dashtype (s1,e1,s2,e2,s3,e3,s4,e4) # 由 1 到 4 数字对
# <实线长度>, <空隙长度> 指定的虚线图案
示例 1
# 使用 1 号线型但由虚线类型区分的两个函数
plot f1(x) with lines lt 1 dt solid, f2(x) with lines lt 1 dt 3
有些终端除了预定义的虚线图案,还支持用户定义的虚线图案。
示例 2
plot f(x) dt 3 # 使用终端指定的 3 号虚线图案
plot f(x) dt ".. " # 实时构建一个虚线图案
plot f(x) dt (2,5,2,15) # 用数字描述上一例的虚线图案
set dashtype 11 (2,4,4,7) # 定义新的 11 号虚线图案
plot f(x) dt 11 # 用新定义的虚线图案绘图
如果使用字符串来指定虚线图案,程序会将其转换为 <solid>,<empty> 对序列。点 "." 变成 (2,5)、短划线 "-" 变成 (10,10)、下划线 "_" 变成 (20,10)、每个空格字符 " " 将前面的 <empty> 值加 10。命令show dashtype将显示原始字符串和转换后的数字序列。
linestyles vs linetypes
linestyle是 linecolor、linewidth、dashtype 和 pointtype 属性的临时关联。使用set style line命令定义。一旦你定义了线条样式,就可以在绘图命令中使用它来控制绘图元素的外观。换句话说,它就像一个线型,除了它的生存时间。linetypes是永久的 (一直存在到你重新定义它们),linestyles在 reset 之后就没了。
示例
# 定义一个新的线条样式,使用终端无关的颜色青色、
# 线宽 3、点类型 6 (圆圈内有个点)。
set style line 5 lt rgb "cyan" lw 3 pt 6
plot sin(x) with linespoints ls 5 # 用户定义的 5 号线条样式