跳转到内容

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]
标准 Gnuplot 调色板

它可以保存到图形文件 

set terminal png
set output 'p.png'
test palette


其中

  • NTSC
    • 灰度值 : 使用 NTSC 系数将 RGB 映射到灰度而计算[3]
    • NTSC 亮度,对应于 YIQ 模型中的 Y 通道。它表示如果颜色显示在黑白电视屏幕上,结果是什么[4]
    • RGB 颜色分量的加权和 [5]
//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 集

 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

cubehelix

[编辑 | 编辑源代码]

由 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;

gray/color

[编辑 | 编辑源代码]

设置灰度调色板

 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;

model/functions

[编辑 | 编辑源代码]

语法

  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 的变量

rgbformulae

[编辑 | 编辑源代码]

语法

 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’
Gnuplot 线性灰度梯度


# Approximate the default palette used by MATLAB:
set pal defined (1 '#00008f', 8 '#0000ff', 24 '#00ffff', 40 '#ffff00', 56 '#ff0000', 64 '#800000')
Matlab 梯度


我们可以从以下位置输入数据:

  • 命令行
  • 从调色板文件 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

参考文献

[编辑 | 编辑源代码]
  1. 维基百科上的颜色梯度
  2. /src/command.c
  3. Charles Poynton 的 Poynton 颜色常见问题解答
  4. P K Janert 的 livebook gnuplot-in-action-second-edition
  5. 英语维基百科上的亮度 (视频)
  6. gnuplot 5.0.4 : 特殊文件名
  7. D. A. Green 关于天文强度图像显示的配色方案
  8. James Davenport 的 cubehelix-or-how-i-learned-to-love
  9. gnuplot 5.5 演示 pm3dgamma
  10. gnuplot 5.0.4 : gamma
  11. gnuplot 4.2 文档:调色板/函数
  12. gnuplot-doc : rgbformulae
华夏公益教科书