Gnuplot/palette
调色板或颜色渐变[1]
调色板是用于
- `pm3d`
- 填充颜色轮廓或多边形
- 彩色直方图
- 彩色渐变背景
- 以及任何它现在或将来实现的东西的…
在这里,它代表一个平滑的“连续”颜色或灰度调色板,但让我们称之为调色板。颜色调色板需要终端条目来填充彩色多边形和平滑颜色的调色板,当前可用于在`set pm3d`的帮助中列出的终端。
颜色值的范围可以通过
- `set cbrange`
- `set log cb`独立调整。
整个调色板在`colorbox`中可视化。
语法
show palette show palette palette <n> {{float | int}} show palette gradient show palette fit2rgbformulae show palette rgbformulae
命令
- `show palette` 显示当前调色板属性。
- `show palette gradient` 显示定义调色板的渐变(如果适用)。
- `show palette rgbformulae` 打印可用的固定灰度 -> 颜色转换公式。
- `show palette palette <n>` 将当前调色板设置和具有 <n> 个离散颜色的调色板计算的 RGB 三元组表打印到屏幕或`set print`指定的檔案。默认宽表可以通过选项 float 或 int 分别限制为 r、g、b 浮点值 [0..1] 或整数值 [0..255] 的 3 列。这样,当前 gnuplot 颜色调色板可以加载到其他图像应用程序中,例如 Octave。或者,`test palette` 命令将绘制当前调色板的 R、G、B 剖面,并将剖面值保留在数据块 $PALETTE 中。
检查标准颜色渐变(传统的 pm3d 是黑色-蓝色-红色-黄色)
show palette
输出
palette is COLOR rgb color mapping by rgbformulae are 7,5,15 figure is POSITIVE all color formulae ARE NOT written into output postscript file allocating ALL remaining color positions for discrete palette terminals Color-Model: RGB gamma is 1.5
帮助
help show palette
命令 `test palette` 绘制 R(z)、G(z)、B(z) 的轮廓,其中 0<=z<=1。这些是当前颜色`palette` 的 RGB 分量。它还绘制使用 NTSC 系数将 RGB 映射到灰度而计算的表观净强度。轮廓值也加载到名为 $PALETTE 的数据块中。
test palette[2]
它可以保存到图形文件
set terminal png set output 'p.png' test palette
其中
- NTSC
//from function test_palette_subcommand from command.c
ntsc = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;
代码
// command.c
/*
* process the 'test palette' command
* 1) Write a sequence of plot commands + set commands into a temp file
* 2) Create a datablock with palette values
* 3) Load the temp file to plot from the datablock
* The set commands then act to restore the initial state
*/
static void
test_palette_subcommand()
{
enum {test_palette_colors = 256};
struct udvt_entry *datablock;
char *save_replot_line;
TBOOLEAN save_is_3d_plot;
int i;
static const char pre1[] = "\
reset;\
uns border; se tics scale 0;\
se cbtic 0,0.1,1 mirr format '' scale 1;\
se xr[0:1];se yr[0:1];se zr[0:1];se cbr[0:1];\
set colorbox hor user orig 0.05,0.02 size 0.925,0.12;";
static const char pre2[] = "\
se lmarg scre 0.05;se rmarg scre 0.975; se bmarg scre 0.22; se tmarg scre 0.86;\
se grid; se xtics 0,0.1;se ytics 0,0.1;\
se key top right at scre 0.975,0.975 horizontal \
title 'R,G,B profiles of the current color palette';";
static const char pre3[] = "\
p NaN lc palette notit,\
$PALETTE u 1:2 t 'red' w l lt 1 lc rgb 'red',\
'' u 1:3 t 'green' w l lt 1 lc rgb 'green',\
'' u 1:4 t 'blue' w l lt 1 lc rgb 'blue',\
'' u 1:5 t 'NTSC' w l lt 1 lc rgb 'black'\
\n";
FILE *f = tmpfile();
#if defined(_MSC_VER) || defined(__MINGW32__)
/* On Vista/Windows 7 tmpfile() fails. */
if (!f) {
char buf[PATH_MAX];
/* We really want the "ANSI" version */
GetTempPathA(sizeof(buf), buf);
strcat(buf, "gnuplot-pal.tmp");
f = fopen(buf, "w+");
}
#endif
while (!END_OF_COMMAND)
c_token++;
if (!f)
int_error(NO_CARET, "cannot write temporary file");
/* Store R/G/B/Int curves in a datablock */
datablock = add_udv_by_name("$PALETTE");
if (datablock->udv_value.type != NOTDEFINED)
gpfree_datablock(&datablock->udv_value);
datablock->udv_value.type = DATABLOCK;
datablock->udv_value.v.data_array = NULL;
/* Part of the purpose for writing these values into a datablock */
/* is so that the user can read them back if desired. But data */
/* will be read back using the current numeric locale, so for */
/* consistency we must also use the locale when creating it. */
set_numeric_locale();
for (i = 0; i < test_palette_colors; i++) {
char dataline[64];
rgb_color rgb;
double ntsc;
double z = (double)i / (test_palette_colors - 1);
double gray = (sm_palette.positive == SMPAL_NEGATIVE) ? 1. - z : z;
rgb1_from_gray(gray, &rgb);
ntsc = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;
sprintf(dataline, "%0.4f %0.4f %0.4f %0.4f %0.4f %c",
z, rgb.r, rgb.g, rgb.b, ntsc, '\0');
append_to_datablock(&datablock->udv_value, strdup(dataline));
}
reset_numeric_locale();
/* commands to setup the test palette plot */
enable_reset_palette = 0;
save_replot_line = gp_strdup(replot_line);
save_is_3d_plot = is_3d_plot;
fputs(pre1, f);
fputs(pre2, f);
fputs(pre3, f);
/* save current gnuplot 'set' status because of the tricky sets
* for our temporary testing plot.
*/
save_set(f);
/* execute all commands from the temporary file */
rewind(f);
load_file(f, NULL, 1); /* note: it does fclose(f) */
/* enable reset_palette() and restore replot line */
enable_reset_palette = 1;
free(replot_line);
replot_line = save_replot_line;
is_3d_plot = save_is_3d_plot;
}
命令 `set palette` 不带选项
set palette
设置默认值
代码
// color.c
void
init_color()
{
/* initialize global palette */
sm_palette.colorFormulae = 37; /* const */
sm_palette.formulaR = 7;
sm_palette.formulaG = 5;
sm_palette.formulaB = 15;
sm_palette.positive = SMPAL_POSITIVE;
sm_palette.use_maxcolors = 0;
sm_palette.colors = 0;
sm_palette.color = NULL;
sm_palette.ps_allcF = FALSE;
sm_palette.gradient_num = 0;
sm_palette.gradient = NULL;
sm_palette.cmodel = C_MODEL_RGB;
sm_palette.Afunc.at = sm_palette.Bfunc.at = sm_palette.Cfunc.at = NULL;
sm_palette.colorMode = SMPAL_COLOR_MODE_RGB;
sm_palette.gamma = 1.5;
}
语法
set palette file '<filename>' {datafile-modifiers}
哪里
- filename 是包含数据列的调色板文件的文件名。它不是扩展名为 pal 的包含 gnuplot 命令的文件
- data-modifiers 是可选的组成部分,用于从调色板(表格)中选择元素。例如:'using ($1/255):($2/255):($3/255)'
命令 `set palette file` 等效于命令 set palette defined,数据从 filename 文件中读取。
我们检查帮助内容
help set palette file
用例
- 文本文件(gpf 不是 pal,我们使用 load 命令加载)
- 二进制文件
- 从命令行读取的数据
语法
set palette file 'palette.txt' using ($1/255):($2/255):($3/255) # Read in a palette of RGB triples each in range [0,255]
文件中可以有
- 4 列:gray、R、G、B
- 三列:R、G、B
# http://soliton.vm.bytemark.co.uk/pub/cpt-city/arendal/arctic.gpf
set palette file "arctic.gpf"
set terminal png
set output "arctic.png"
test palette
文本文件 gpf 集
- cpt-city : "Gnuplot Palette File (with gpf extension) in the RGB colour-space"(4 列)
- Fractint 程序的地图文件(3 列)
set palette file "Skydye07.map" using ($1/255):($2/255):($3/255) # Read in a palette of RGB triples each in range [0,255]
语法
set palette file "palette.bin" binary record=64 using 1:2:3 # put 64 triplets of R,G,B doubles into file palette.bin and load
我们可以使用此命令在命令行中输入颜色表
- 我们提供“-”[6] 而不是文件名
- 输入表格
- 用字母 e 结束
# Equidistant rainbow (blue-green-yellow-red) palette
set palette model RGB file "-"
0 0 1
0 1 0
1 1 0
1 0 0
e
# cpt-city/ma/gray/grayscale01a 0 … 100, continuous, RGB, 3 segments
set palette file "-"
0.00000 0.00000 0.00000 0.00000
0.35010 0.93333 0.93333 0.93333
0.75000 0.80000 0.80000 0.80000
1.00000 0.66667 0.66667 0.66667
e
-
2D RGB 剖面
-
3D RGB 剖面
由 D A Green (2011)[7] 开发的颜色调色板系列,其中颜色(色调)沿着标准色轮变化,而当灰度值从 0 变为 1 时,强度单调增加。
优势
- 在彩色和黑白中同样打印良好[8]
gnuplot> set palette cubehelix
gnuplot> show palette
palette is COLOR
Cubehelix color palette: start 0.5 cycles -1.5 saturation 1
figure is POSITIVE
all color formulae ARE NOT written into output postscript file
allocating ALL remaining color positions for discrete palette terminals
Color-Model: RGB
gamma is 1.5
在代码中
// color.h: t_sm_palette typedef struct (Declaration of smooth palette, i.e. palette for smooth colours)
/* control parameters for the cubehelix palette scheme */
double cubehelix_start; /* offset (radians) from colorwheel 0 */
double cubehelix_cycles; /* number of times round the colorwheel */
double cubehelix_saturation; /* color saturation */
cubehelix 调色板可以通过 gamma 修改。例如
set palette cubehelix gamma 2.0
使用 gnuplot 代码的 C 函数
/*
GNUPLOT - stdfn.h
Copyright 1986 - 1993, 1998, 2004 Thomas Williams, Colin Kelley
*/
#ifndef clip_to_01
#define clip_to_01(val) \
((val) < 0 ? 0 : (val) > 1 ? 1 : (val))
#endif
/*
input : position
output : c array ( rgb color)
the colour scheme spirals (as a squashed helix) around the diagonal of the RGB colour cube
https://arxiv.org/abs/1108.5083
A colour scheme for the display of astronomical intensity images by D. A. Green
*/
void GiveCubehelixColor(double position, unsigned char c[]){
/* GNUPLOT - color.h
* Petr Mikulik, December 1998 -- June 1999
* Copyright: open source as much as possible
*/
// t_sm_palette
/* gamma for gray scale and cubehelix palettes only */
double gamma = 1.5;
/* control parameters for the cubehelix palette scheme */
//set palette cubehelix start 0.5 cycles -1.5 saturation 1
//set palette gamma 1.5
double cubehelix_start = 0.5; /* offset (radians) from colorwheel 0 */
double cubehelix_cycles = -1.5; /* number of times round the colorwheel */
double cubehelix_saturation = 1.0; /* color saturation */
double r,g,b;
double gray = position;
/*
Petr Mikulik, December 1998 -- June 1999
* Copyright: open source as much as possible
*/
// /* Map gray in [0,1] to color components according to colorMode */
// function color_components_from_gray
// from gnuplot/src/getcolor.c
double phi, a;
phi = 2. * M_PI * (cubehelix_start/3. + gray * cubehelix_cycles);
// gamma correction
if (gamma != 1.0) gray = pow(gray, 1./gamma);
a = cubehelix_saturation * gray * (1.-gray) / 2.;
// compute
r = gray + a * (-0.14861 * cos(phi) + 1.78277 * sin(phi));
g = gray + a * (-0.29227 * cos(phi) - 0.90649 * sin(phi));
b = gray + a * ( 1.97294 * cos(phi));
// normalize to [9,1] range
r = clip_to_01(r);
g = clip_to_01(g);
b = clip_to_01(b);
// change range to [0,255]
c[0] = (unsigned char) 255*r; //R
c[1] = (unsigned char) 255*g; // G
c[2] = (unsigned char) 255*b; // B
}
示例
语法
set palette gamma <gamma>
将 gamma 系数设置为 <gamma> 值
gamma 系数的标准值为 1.5
示例:[9]
set palette gamma 1.25
使用其他方法进行 gamma 校正:[10]
set palette model RGB set palette functions gray**0.64, gray**0.67, gray**0.70
或
gamma = 2.2
color(gray) = gray**(1./gamma)
set palette model RGB functions color(gray), color(gray), color(gray) # A gamma-corrected black and white palette
对于灰度调色板,而不是
set palette defined ( 0 0 0 0, 1 1 1 1 )
我们可以使用
set palette defined ( 0 0 0 0, 0.5 .73 .73 .73, 1 1 1 1 )
在代码中查看
// color.h
/* gamma for gray scale and cubehelix palettes only */
double gamma;
设置灰度调色板
set palette gray
在标准设置下,这等效于
set palette gray positive gamma 1.5 # nieliniowa
如果我们想要获得线性调色板,我们将 gamma 设置为 1.0
set palette gray gamma 1.0 # liniowa plaeta
返回彩色调色板
set palette color
另请参阅颜色模式
//color.h
/*
* color modes
*/
typedef enum {
SMPAL_COLOR_MODE_NONE = '0',
SMPAL_COLOR_MODE_GRAY = 'g', /* grayscale only */
SMPAL_COLOR_MODE_RGB = 'r', /* one of several fixed transforms */
SMPAL_COLOR_MODE_FUNCTIONS = 'f', /* user defined transforms */
SMPAL_COLOR_MODE_GRADIENT = 'd', /* interpolated table:
* explicitly defined or read from file */
SMPAL_COLOR_MODE_CUBEHELIX = 'c'
} palette_color_mode;
语法
set palette functions <R>,<G>,<B>
set palette model { RGB | HSV | CMY | YIQ | XYZ }
可以组合使用:[11]
set palette model HSV functions gray, 1, 1 # full color hsv = rainbow set palette model XYZ functions gray**0.35, gray**0.5, gray**0.8 # black to gold
gamma = 2.2
color(gray) = gray**(1./gamma)
set palette model RGB functions color(gray), color(gray), color(gray) # A gamma-corrected black and white palette
定义
- gray 是一个取值范围为 0 到 1 的变量
语法
set palette rgbformulae <r>,<g>,<b>
缩写形式
set palette rgb r,g,b
r、g 和 b 是用于计算每种颜色成分的函数。(尽管颜色成分的名称是 R、G 和 B,但它们的含义取决于 色彩空间,即在 HSV 模型中,R 将代表 H)。我们有 37 个内置函数,从 0 到 36 编号(负数会产生相反的梯度)。我们可以显示它们
show palette rgbformulae
我们将获得
* there are 37 available rgb color mapping formulae: 0: 0 1: 0.5 2: 1 3: x 4: x^2 5: x^3 6: x^4 7: sqrt(x) 8: sqrt(sqrt(x)) 9: sin(90x) 10: cos(90x) 11: |x-0.5| 12: (2x-1)^2 13: sin(180x) 14: |cos(180x)| 15: sin(360x) 16: cos(360x) 17: |sin(360x)| 18: |cos(360x)| 19: |sin(720x)| 20: |cos(720x)| 21: 3x 22: 3x-1 23: 3x-2 24: |3x-1| 25: |3x-2| 26: (3x-1)/2 27: (3x-2)/2 28: |(3x-1)/2| 29: |(3x-2)/2| 30: x/0.32-0.78125 31: 2*x-0.84 32: 4x;1;-2x+1.84;x/0.08-11.5 33: |2*x - 0.5| 34: 2*x 35: 2*x - 0.5 36: 2*x - 1 * negative numbers mean inverted=negative colour component * thus the ranges in `set pm3d rgbformulae' are -36..36
代码位于:gnuplot/src/getcolor.c/GetColorValueFromFormula
默认情况下,红色成分选择函数编号 7,绿色成分选择函数编号 5,蓝色成分选择函数编号 15。我们可以选择其他组合,例如文档中建议的“热”组合(即黑色-红色-黄色-白色)。
set palette rgbformulae 21,22,23
或反向热梯度
set palette rgbformulae -21,-22,-23
或反向线性灰度梯度
set palette rgbformulae -3,-3,-3 # 1-x, 1-x, 1-x
RGB 空间示例:[12]
7,5,15 ... traditional pm3d (black-blue-red-yellow) 3,11,6 ... green-red-violet 23,28,3 ... ocean (green-blue-white); try also all other permutations 30,31,32 ... color printable on gray (black-blue-violet-yellow-white) 33,13,10 ... rainbow (blue-green-yellow-red) 34,35,36 ... AFM hot (black-red-yellow-white)
完整的 HSV 调色板
3,2,2 ... red-yellow-green-cyan-blue-magenta-red
语法
set palette defined { ( <gray1> <color1> {, <grayN> <colorN>}... ) }
其中
<color> := { <r> <g> <b> | ’<color-name>’ | ’#rrggbb’ }
调色板是通过定义中指定的数值之间的线性插值构建的。
示例
set palette defined (0 "dark-green", 1 "green", 1 "yellow", 4 "red")
test palette
我们得到一个不连续的梯度。
使用 2 种颜色,我们在白色(1 1 1)和黑色(0 0 0)之间获得连续梯度(线性)。
set palette model RGB
set output "gray.png"
set palette defined (0 1 1 1, 1 0 0 0) # <r> <g> <b>
test palette
set palette 命令的另一种等效语法
set palette defined ( 0 "white", 1 "black") # ’<color-name>’
set palette defined ( 0 "#ffffff", 1 "#000000") # ’#rrggbb’
# Approximate the default palette used by MATLAB:
set pal defined (1 '#00008f', 8 '#0000ff', 24 '#00ffff', 40 '#ffff00', 56 '#ff0000', 64 '#800000')
我们可以从以下位置输入数据:
- 命令行
- 从调色板文件 pal
load 'a.pal'
文本文件 pal 的示例
# jet.pal with 4 columns
set palette defined (0 0.0 0.0 0.5, \
1 0.0 0.0 1.0, \
2 0.0 0.5 1.0, \
3 0.0 1.0 1.0, \
4 0.5 1.0 0.5, \
5 1.0 1.0 0.0, \
6 1.0 0.5 0.0, \
7 1.0 0.0 0.0, \
8 0.5 0.0 0.0 )
# ColorBrewer Accent
# https://github.com/Gnuplotting/gnuplot-palettes/blob/master/accent.pal
# for use with qualitative/categorical data
# provides 8 colors, 4 pale and 4 saturated
# compatible with gnuplot >=4.2
# author: Anna Schneider
# pale green - pale purple - pale orange - pale yellow - blue - magenta - brown - grey
# palette
set palette maxcolors 8
set palette defined (
0 '#7FC97F',\
1 '#BEAED4',\
2 '#FDC086',\
3 '#FFFF99',\
4 '#386CB0',\
5 '#F0027F',\
6 '#BF5B17',\
7 '#666666' )
调色板集合
检查当前调色板的梯度
show palette gradient
我们得到
0. gray=0.0000, (r,g,b)=(1.0000,1.0000,1.0000), #ffffff = 255 255 255 1. gray=1.0000, (r,g,b)=(0.0000,0.0000,0.0000), #000000 = 0 0 0
- ↑ 维基百科上的颜色梯度
- ↑ /src/command.c
- ↑ Charles Poynton 的 Poynton 颜色常见问题解答
- ↑ P K Janert 的 livebook gnuplot-in-action-second-edition
- ↑ 英语维基百科上的亮度 (视频)
- ↑ gnuplot 5.0.4 : 特殊文件名
- ↑ D. A. Green 关于天文强度图像显示的配色方案
- ↑ James Davenport 的 cubehelix-or-how-i-learned-to-love
- ↑ gnuplot 5.5 演示 pm3dgamma
- ↑ gnuplot 5.0.4 : gamma
- ↑ gnuplot 4.2 文档:调色板/函数
- ↑ gnuplot-doc : rgbformulae