在Gnuplot中使用调色板打印时,将某些截止点以下的点的颜色设置为灰色

在Gnuplot中使用调色板打印时,将某些截止点以下的点的颜色设置为灰色,gnuplot,Gnuplot,抱歉,标题太长,可能很糟糕 我试图在gnuplot中绘制一些数据,其中数据文件的格式为 x y z 1.0 1.5 0.1 1.3 1.8 0.7 2.1 3.7 1.1 3.1 4.3 1.5 3.7 4.7 1.8 我想绘制y和x,对于每个点,用点的颜色表示z的值。目前,我为此使用以下代码: size = 0.5 type = 7 set term pngcairo set outpu

抱歉,标题太长,可能很糟糕

我试图在gnuplot中绘制一些数据,其中数据文件的格式为

x       y       z
1.0     1.5     0.1
1.3     1.8     0.7
2.1     3.7     1.1
3.1     4.3     1.5
3.7     4.7     1.8
我想绘制y和x,对于每个点,用点的颜色表示z的值。目前,我为此使用以下代码:

size = 0.5
type = 7
set term pngcairo 
set output 'Foo.png'
set palette rgbformulae 22,13,-31
set cblabel "z"
unset key
set xlabel 'x'
set ylabel 'y'
set title 'y vs. x'
plot "Data.txt" u 1:2:3 w p pt type ps size palette
这是可行的,但我想做以下更改:对于z值低于截止值(例如1.0)的每个点,我希望颜色设置为灰色,而不管z值如何。然后,对于大于或等于截止值的z值,我希望根据z值从调色板中拾取颜色


因此,我希望颜色在截止值处不连续地从灰色变为蓝色(对于当前调色板)。这可以做到吗?如果可以,如何做到?

基于RGB公式的调色板很难做到。使用定义的调色板相对容易。下面是一个例子,它提供了一个接近您选择的调色板,在底端加上了一个深灰色<然后设置代码>cRange,以使z截止值最小。cbmin以下的所有z值都将指定端点值,在本例中为深灰色

set xrange [0:1]; set yrange [0:pi]
set sample 100; set isosample 100
set palette defined (-0.01 "grey20", 0 "blue", 0.4 "green", 0.6 "yellow", 1.0 "red")

zmin = -0.6
set cbrange [zmin: *]
set xyplane at zmin
splot cos(x)*sin(y+y*(x*x)) with pm3d

在gnuplot 5.4之后,可以通过使用“使用”中的函数“palete()”并将其与“with point lc rgb变量”组合来实现

原始代码中的
size=3###0.5
类型=7
设置术语pngcairo
设置输出“Foo.png”
设置调色板RGB公式22,13,-31
设置cblabel“z”
取消设置键
设置xlabel'x'
设置为“y”
设置标题“y对x”
设置cbrange[0:2]###这是palette()函数所必需的
灰色=0x8080###灰色,用整数表示
绘图NaN w p调色板\

“Data.txt”u1:2:($3这里是gnuplot 5.2版本。您可以使用RGB公式调色板。 它使用在执行命令
测试调色板
后创建的数据块
$palete

代码:(使用低至5.2.0的gnuplot进行测试)

给定RGB公式调色板的截止颜色(gnuplot>=5.2) 重置会话 #创建一些测试数据 设置xrange[-5:5] 设置Y范围[-5:5] 设置样本50个 设置50个样本 设置表$Data splot(sin(1.3*x)*cos(.9*y)+cos(.8*x)*sin(1.9*y)+cos(y*.2*x))*3 未设置的表 设置调色板RGB公式22,13,-31 测试调色板#将调色板放入datablock$调色板所需 myColorMin=0 myColorMax=6 MyOutfrangeColor=0x808080 myColorPos(c)=int(255.0*(c-myColorMin)/(myColorMax-myColorMin))+1 myColor(c)=cmyColorMax?myourofrangecolor:\
(int(单词($palete[myColorPos(c)],2)*0xff)谢谢,那太好了!当我添加你建议的调色板和合适的C范围时,灰色值显示在我右边色阶的最底部。你知道有没有办法去除这个吗?不知道。你可以把它做成调色板中更薄的一部分。而不是
-0.01“grey20”
,可能使用
-0.001“grey20”
。但是我认为颜色栏中显示的切片永远不会小于总高度的1/128。应该提到的是,我想
调色板()
函数只在gnuplot 5.4.0之后才存在,而不是在gnuplot 5.2.8中。谢谢您的回复!我的gnuplot版本是5.2(似乎无法升级)因此我无法尝试您的解决方案(请参见@theozh的评论)。因此,我接受了Ethan的回答。@theozh“palette(z)”功能似乎是在2020年2月(5.2.8之后)添加的。我更新了答案。谢谢你指出这一点。@AlexandreVandermonde我很抱歉听到你现在不能尝试它。如果你有机会升级gnuplot,你可以做类似的事情。谢谢你的回复,包括解释。谢谢你,那太好了!我可能会保留Ethan的答案,因为他是第一个,因为我是否使用RGB公式调色板并不重要。
size = 3 ### 0.5 in original code 
type = 7
set term pngcairo 
set output 'Foo.png'
set palette rgbformulae 22,13,-31
set cblabel "z"
unset key
set xlabel 'x'
set ylabel 'y'
set title 'y vs. x'

set cbrange [0:2]  ### this is required by palette() function
gray = 0x808080    ### gray color expressed by integer

plot NaN w p palette, \
     "Data.txt" u 1:2:($3<1 ? gray : palette($3)) w p pt type ps size lc rgb variable
### cut-off colors for a given rgbformulae palette (gnuplot >=5.2)
reset session

# create some test data
set xrange [-5:5]
set yrange [-5:5]
set samples 50
set isosamples 50
set table $Data 
    splot (sin(1.3*x)*cos(.9*y)+cos(.8*x)*sin(1.9*y)+cos(y*.2*x))*3
unset table

set palette rgbformulae 22,13,-31
test palette   # necessary to put the palette into the datablock $PALETTE
myColorMin = 0
myColorMax = 6
myOutOfRangeColor = 0x808080
myColorPos(c) = int(255.0 * (c-myColorMin)/(myColorMax - myColorMin))+1
myColor(c) = c<myColorMin || c>myColorMax ? myOutOfRangeColor : \
             (int(word($PALETTE[myColorPos(c)],2)*0xff)<<16) + \
             (int(word($PALETTE[myColorPos(c)],3)*0xff)<<8) + \
             (int(word($PALETTE[myColorPos(c)],4)*0xff))

set cbrange [myColorMin:myColorMax]
set view 36, 72
set ztics 5

splot $Data u 1:2:3:(myColor($3)) w pm3d  lc rgb variable notitle
### end of code