Gnuplot:箭头的范围,如何阻止它们出现在图表范围旁边?

时间:2016-07-21 11:47:56

标签: range gnuplot

我需要绘制光谱图,此外,我想展示一些典型的光谱线。这是通过为数千个光谱自动生成的脚本完成的,因此我没有可能选择要为每个光谱显示的线条,它们应该由xrange oder yrange自动选择。可悲的是,这个范围似乎不适用于箭头,因此我需要一些其他的想法来防止线条出现在情节之外。我用if条件尝试过,但这并没有带来奇怪的变化。 以下是该脚本的一些摘录:

set terminal png size 1000,1414
set output "FeLoBAL_plot_1.png"
set multiplot layout 4,1 title "FeLoBAL-Spektren des SDSS DR12"
unset xrange
unset yrange
stats '170.txt' using 2 name "Fluss" nooutput
stats '170.txt' using 1 name "A" nooutput
set xlabel 'Wellenlaenge [{\305}]'
set ylabel 'Fluss [erg/cm²/s/{\305}]'
set yrange [-0.5:(Fluss_mean*3)]
set xrange [(A_min/(1.699+1)):(A_max/(1.699+1))]
p '170.txt' u (($1)/(1.699+1)):2 with lines title "Nr.: 170; J000256.55+092025.5; z=1.699"
if(2799 > (A_min/(1.699+1)+20) && 2799 < (A_max/(1.699+1)-20)){set arrow from 2799, graph 0 to 2799, graph 1 nohead; set label "Mg II" at 2804, graph 0.8 }
if(1908 > (A_min/(1.699+1)+20) && 1908 < (A_max/(1.699+1)-20)){set arrow from 1908, graph 0 to 1908, graph 1 nohead; set label "C III" at 1913, graph 0.8 }
if(1549 > (A_min/(1.699+1)+20) && 1549 < (A_max/(1.699+1)-20)){set arrow from 1549, graph 0 to 1549, graph 1 nohead; set label "C IV" at 1554, graph 0.8 }
if(1240 > (A_min/(1.699+1)+20) && 1240 < (A_max/(1.699+1)-20)){set arrow from 1240, graph 0 to 1240, graph 1 nohead; set label "N V" at 1245, graph 0.8 }
if(6562 > (A_min/(1.699+1)+20) && 6562 < (A_max/(1.699+1)-20)){set arrow from 6562, graph 0 to 6562, graph 1 nohead; set label "H{/symbol a}" at 6567, graph 0.8 enhanced }
if(4861 > (A_min/(1.699+1)+20) && 4861 < (A_max/(1.699+1)-20)){set arrow from 4861, graph 0 to 4861, graph 1 nohead; set label "H{/symbol b}" at 4866, graph 0.8 enhanced }
if(4959 > (A_min/(1.699+1)+20) && 4959 < (A_max/(1.699+1)-20)){set arrow from 4959, graph 0 to 4959, graph 1 nohead; set label "O III" at 4964, graph 0.8 }
if(5007 > (A_min/(1.699+1)+20) && 5007 < (A_max/(1.699+1)-20)){set arrow from 5007, graph 0 to 5007, graph 1 nohead; set label "O III" at 5012, graph 0.8 }
if(4340 > (A_min/(1.699+1)+20) && 4340 < (A_max/(1.699+1)-20)){set arrow from 4340, graph 0 to 4340, graph 1 nohead; set label "H{/symbol g}" at 4345, graph 0.8 enhanced }
if(1216 > (A_min/(1.699+1)+20) && 1216 < (A_max/(1.699+1)-20)){set arrow from 1216, graph 0 to 1216, graph 1 nohead; set label "L{/symbol a}" at 1221, graph 0.88 enhanced }

有没有人想要改进这个或看到错误,为什么这不能正常工作? 谢谢!

2 个答案:

答案 0 :(得分:0)

我不熟悉在gnuplot中使用if语句。当我需要做远程类似的事情时,我使用了三元运算符。它会是这样的:

(Amin+20 < 1200 && Amax-20 > 1200) ? {set label 'blabla'} :\
(Amin+20 < 1500 && Amax-20 > 1500) ? {set label 'blibla'} :\
...
(Amin+20 < 1800 && Amax-20 > 1800) ? {set label 'blubla'} : 1/0

另外我会在情节陈述之前加上这些,但可能没关系。我认为,根据你的陈述,如果例如A_min非常小且A_max非常大,那么它们中的许多可能同时是真的。使用三元构造评估第一个真实语句(更像是if-elseif-construct)。

根据您使用此脚本的环境类型,可能发生的另一个危险是标签获取set而永远不会获得unset。通过这种方式,一旦语句变为真,对于会话的其余部分都是如此,所有即将到来的情节都会得到它。所以你可以尝试添加

unset label
unset arrow

在脚本的开头。

答案 1 :(得分:0)

两个命令set arrowset label不尊重绘图区域,因为它们用于装饰任何地方的图形。

将标签及其位置放在数据文件中并绘制出来。

使用

创建文件labels.txt
2799 "Mg II"
1908 "C III"
1549 "C IV"
1240 "N V"
6562 "H{/symbol a}"
4861 "H{/symbol b}"
4959 "O III"
5007 "O  III"
4340 "H{/symbol g}"
1216 "L{/symbol a}"

然后用

绘制它
reset
stats '170.txt' using 2 name "Fluss" nooutput
stats '170.txt' using 1 Name "A" nooutput

x(v) = v / (1.699+1)
ymin = -0.5
ymax = Fluss_mean*3
ylbl = ymin + 0.8 * (ymax - ymin) 

set yrange [ymin:ymax]
set xrange [x(A_min):x(A_max)]

 plot '170.txt' u (x($1)):2 with lines, \
     'labels.txt` u 1:(ylbl):2 with labels enhanced t '',\
     '' u 1:(ymin):(0):(ymax - ymin) with vectors nohead t ''

由于您无法使用graph plot坐标,因此您必须计算等效值,因为无论如何都使用stats,这不是问题。