所以我有这种数据
3.500E2 -0.956862
...
10.00E2 -1.95941
在文件中。
如果我绘制它,它看起来像这样:
现在我希望曲线下方的区域充满可见光谱,如下所示:
我已经找到了this forum post,它为我绘制了一个很好的可见光谱,但我无法进一步添加自己的曲线,因为这似乎是一个pm3d图。
我该怎么办?
答案 0 :(得分:6)
filledcurves
绘图样式无法处理此类渐变填充,但您可以修改数据文件,以便将其与pm3d
和splot
一起使用。
pm3d
样式仅适用于曲面,因此您必须编辑数据文件以实际提供曲面网格。
为此,您必须向文件添加第二个数据块,该数据块在第一列中具有相同的值,并且第二列的所有值的最小值作为其第二列。两个块必须用空行分隔。
考虑示例数据文件spectrum.dat
:
350 1
400 2
450 5
500 2
550 1
600 3
650 3
700 8
750 4
800 3
850 0
由此你必须得到一个文件
350 1
400 2
450 5
500 2
550 1
600 3
650 3
700 8
750 4
800 3
850 0
350 0
400 0
450 0
500 0
550 0
600 0
650 0
700 0
750 0
800 0
850 0
可以使用awk动态完成(由于@TomFenech,命令变得更好),然后使用您链接的论坛帖子中的函数定义绘制with pm3d
:
lmax = 780; lmin = 380
k=lmax-lmin
set cbrange [lmin:lmax]
r(x)=x<440?-(x-440)/(440-380):x<510?0:x<580?(x-510)/(580-510):x<=780?1:0
g(x)=x<440?0:x<490?(x-440)/(490-440):x<580?1:x<645?-(x-645)/(645-580):0
b(x)=x<490?1:x<510?-(x-510)/(510-490):0
f(x)=x<420?0.3+0.7*(x-380)/(420-380):x<700?1:0.3+0.7*(780-x)/(780-700)
set palette functions f(k*gray+lmin)*r(k*gray+lmin),g(k*gray+lmin),f(k*gray+lmin)*b(k*gray+lmin)
set pm3d map interpolate 0,1
set autoscale xfix
splot '<awk ''NR == FNR {min = !min || $2 < min ? $2 : min; print; next} FNR == 1 {print ""} {$2 = min}1'' spectrum.dat spectrum.dat' using 1:2:(0):1 notitle
请注意,如果您有足够的数据点,则无需插入pm3d调色板。在这种情况下,这可能只会给你带来奇怪的瑕疵(白色垂直线条)。
答案 1 :(得分:0)
每当我想绘制VIS光谱时,我经常会遇到这个问题。我详细阐述了@Christoph的答案,并希望使颜色部分更简单。这确实是可能的,使用HSV空间而不是RGB。此外,它允许简单计算吸收光谱的互补色。
色调角度gnuplot必须在0:1范围内,在所有其他来源0-360。 角度0对应于红色(假设为780nm)。 紫外线边缘处于300度的色调空间。
Gnuplot自动将输入数据缩放到cbrange中,因此我们需要将cbrange最大值放入UV中并切断Hue的洋红色部分(300度= 0.83 gnuplot Hue)。 最后,色调与波长成反比,因此调色板功能为(1灰色),饱和度和值设置为常数0.5
lmax = 780; lmin = 330
hmax=0.83
cbmax=lmax-((lmax-lmin)/hmax)
set cbrange [lmin:lmax]
h(x)=(x>hmax)?hmax:x
set palette model HSV functions h(1-gray),0.5,0.5
set pm3d map interpolate 0,1
splot '<awk ''NR == FNR {min = !min || $2 < min ? $2 : min; print; next} FNR == 1 {print ""} {$2 = min}1'' spectrum.dat spectrum.dat' using 1:2:(0):1 notitle
情节的其余部分是相同的