我正在尝试使用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>