Gnuplot 4d地图颜色条具有基于数据的不同透明度

时间:2017-11-10 23:39:52

标签: gnuplot transparent colorbar 4d

我正在尝试使用splot绘制4d图(x y z值)。我想将第4列显示为热色。到目前为止,我很好。在网上搜索答案之后,我无法弄清楚的是,点的颜色是透明的,但根据它们的价值具有不同的透明度。

例如,我们说我有以下数据集:

0 0 0 0.1
0 0 1 0.2

0 1 0 0.2
0 1 1 2

1 0 0 1
1 0 1 3

1 1 0 0.5
1 1 1 4

现在,我想让colorbar(对于第4列)如此:第4列值越接近1,图中的点/点就越透明。我所看到的所有地方只能给我整个颜色条的统一透明度。

我想知道是否有人曾经处理过这个问题,或者知道如何做到这一点。 非常感谢你!

1 个答案:

答案 0 :(得分:0)

< p>我并不完全理解您希望透明度如何依赖于值,因此我将给出一般答案,您可以在其中替换透明度函数。< / p> < p>虽然您可以指定< a href =" http://gnuplot.sourceforge.net/demo/rgba_lines.html" rel =" nofollow noreferrer">线条颜色的透明度< / a>,这在使用调色板时似乎是不可能的,这将是实现您想要的最直接的方式。使用gnuplot最远的方法是使颜色看起来透明,如下面的脚本所示,其中in.data是包含样本数据的文件。< / p> < pre>< code>#!/ usr / bin / env gnuplot 设定术语pngcairo in_data =" in.data" 出发" out.png" #功能将颜色和alpha通道与白色背景相结合 #0:没有透明度,1:完全透明 make_transparent(x1,t)=(1-t)* x1 + t #一个决定透明度的函数 #输入和输出必须在[0,1]的范围内 #get_transparency(x1)= 0#没有透明度 #get_transparency(x1)= 1#完全透明 get_transparency(x1)= 1 - x1#较小的值更透明 #avient函数截断值 minval(x1,x2)= x1< x2?x1:x2 maxval(x1,x2)= x1> x2?x1:x2 truncval(x1,xmin,xmax)= maxval(minval(x1,xmax),xmin) trunc(x1)= truncval(x1,0,1) #默认调色板由rgbfunctions 7,5,15组成 #我们在这里重新定义了启用透明度的版本 #输入和输出必须在[0,1]的范围内 #参见其他公式" show palette rgbformulae" gnuplot中的命令 f7(x1)= make_transparent(sqrt(x1),get_transparency(x1)) f5(x1)= make_transparent(x1 ** 3,get_transparency(x1)) f15(x1)= make_transparent(trunc(sin(2 * pi * x1)),get_transparency(x1)) 设置调色板模型RGB功能f7(灰色),f5(灰色),f15(灰色) splot in_data调色板 < /代码>< /预> < p>此脚本假定背景为白色,但可以适应任何其他纯色背景。然而,一旦点开始重叠,它就会崩溃。< / p> < p>要获得真正的透明度,您需要将每个数据点绘制为单独的一行,并为其指定明显的线条颜色。这可以通过预处理数据来实现,如下面的bash脚本。< / p> < pre>< code>#!/ usr / bin / env bash 设置-eu IN_DATA =" in.data" out_png =" out.png" PI = 3.141592653589793 #function将数据值转换为rgba值 function value2rgba() {   #function的参数   local val =" $ {1}"   local min =" $ {2}"   local max =" $ {3}"   #normalized value   local nval = $(bc -l<<<"($ {val} - $ {min})/($ {max} - $ {min})")   #### alpha通道值####   local alpha =" $(bc -l<<<" 255 *(1 - $ {nval})")"   #轮到十进制   alpha = $(printf"%0.f"" $ {alpha}")   ####红色通道值####   #ggbformulae 7在gnuplot中   local red =" $(bc -l<<<<" 255 * sqrt($ {nval})")"   #轮到十进制   red = $(printf"%0.f"" $ {red}")   ####绿色通道值####   gnuplot中的#rgbformulae 5   local red =" $(bc -l<<<<" 255 * sqrt($ {nval})")"   local green =" $(bc -l<<<" 255 * $ {nval} ^ 3")"   #轮到十进制   green = $(printf"%0.f"" $ {green}")   ####蓝色通道值####   #ggbformulae 15在gnuplot中   local blue =" $(bc -l<<<<" 255 * s(2 * $ {pi} * $ {nval})")"   #轮到十进制   blue = $(printf"%0.f"" $ {blue}")   #确保蓝色为正   if((蓝色< 0))   然后     蓝色= 0   科幻   ###整个rgba值   当地的rgba ="#"   rgba + =" $(printf"%02x"" $ {alpha}")"   rgba + =" $(printf"%02x"" $ {red}")"   rgba + =" $(printf"%02x"" $ {green}")"   rgba + =" $(printf"%02x"" $ {blue}")"   echo" $ {rgba}" } #数据没有空行 data =" $(sed -E" / ^ [[:space:]] * $ / d"" $ {in_data}")" #行数 nline = $(wc -l<<<" $ {data}") #获取第4列的最小值和最大值 min_max =($(awk' {print $ 4}'<<<" $ {data}" | sort -g | sed -n' 1p; $ p')) #每个点的颜色数组 颜色=() 读取-r行 做   colors + =($(value2rgba" $ {line}"" $ {min_max [@]}")) 完成< <(awk' {print $ 4}'<<<" $ {data}") #将坐标聚集到一行 coords =($(awk' {print $ 1,$ 2,$ 3}'<<<" $ {data}")) gnuplot<< EOF 设定术语pngcairo 出发" $ {out_png}" \ $ DATA<< EOD $ {COORDS [@]} EOD n第= $ {n线} 颜色=" $ {颜色[@]}" 未设置密钥 [i = 0:nline-1] \ $ DATA \的splot   u(列(3 * i + 1)):(列(3 * i + 2)):(列(3 * i + 3))   pt 1 lc rgb word(colors,i + 1) EOF < /代码>< /预> < p>这些脚本使用gnuplot 5进行测试。< / p>