1

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

设置 cbrange [0:1]

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

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

我发现我可以在对数刻度中使用调色板:

设置日志cb

但这当然对我也不好,因为我想要什么。我需要将自定义函数应用于调色板中的空间值。那可能吗?

4

1 回答 1

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)函数。

这是脚本:

# 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
于 2013-11-03T14:25:05.053 回答