Gnuplot - 用函数定义调色板的间距

时间:2013-10-30 15:11:22

标签: colors gnuplot color-palette

我正在绘制一个数据文件,其点的颜色是通过从0到1的调色板定义的。颜色是指文件列中的值;我指定了一个具有不同色调“蓝色”的调色板:

  

设置cbrange [0:1]

     

设置调色板定义(1“#B0E2FF”,2“#87CEFA”,3“#7EC0EE”,4“#4F94CD”,5“#4E78A0”,6“#104E8B”,7“#1B3F8B”,8 “#162252”)

问题是,调色板的颜色呈线性间隔。所以对于我的数据来说这并不好,我希望在中间值范围(大颜色箱)中获得更高的精度,在极端情况下(小颜色箱)需要更小的精度。

我发现我可以在日志范围内使用调色板:

  

设置log cb

但考虑到我想要的东西,这对我来说当然也不好。我需要在我的调色板中对空间值应用自定义函数。这可能吗?

1 个答案:

答案 0 :(得分:1)

如果你有一个根据三个函数定义的调色板,或者你有一个包含调色板值的数据文件,那么这是可能的。

考虑一下,你有一个映射函数map(x)(即你的自定义函数),它从[0:1] -> [0:1]映射并拉伸/缩小灰度范围。然后你可以使用:

red(x) = ...
green(x) = ...
blue(x) = ...
map(x) = ...
set palette functions red(map(gray)), green(map(gray)), blue(map(gray))

相应的文件:

map(x) = ...
set palette file 'palette.dat' using (map($1)):2:3:4

在您的情况下,您可以:

  1. 根据需要定义调色板(例如使用set palette defined ...
  2. 将调色板写入外部数据文件。这会为“红色”写一个数据集,一个用于“绿色”,一个用于“蓝色”,一个用于NTSC灰度值。
  3. 重新排列数据文件以对set palette file有用。这里我使用以下python脚本palette.py

    import numpy as np
    import sys
    
    A = np.loadtxt(sys.stdin, usecols=(0,1))
    np.savetxt(sys.stdout, A.reshape(256,8, order='F')[:,(0,4,5,6,7)], fmt='%.3f')
    
  4. 定义合适的map(x)函数。

  5. 这是脚本:

    # 1.
    set palette defined (1 "#B0E2FF", 2 "#87CEFA", 3 "#7EC0EE", 4 "#4F94CD", 5 "#4E78A0", 6 "#104E8B", 7 "#1B3F8B", 8 "#162252")
    
    # 2.
    set terminal push
    set terminal unknown
    set table 'palette.tmp'
    test palette
    unset table
    set terminal pop
    
    # 3.
    system('python palette.py < palette.tmp > palette.dat')
    
    # 4.
    map(x) = (-0.5+(2*(x-0.5))**3 + x)/3 + 0.5
    set palette file 'palette.dat' using (map($1)):2:3:4
    
    test palette