我有一个感兴趣的化合物的红外光谱,我想绘制,我有一个带有所有数据点的 spectrum.dat 文件。它的形式为:
# X Y
300 100
301 100
302 99
303 70
...
3999 98
4000 100
我想使用典型的红外光谱的x轴来绘制这个图,但我在这方面遇到了麻烦。 If you are unfamiliar, this is what a typical IR spectrum might look like(除了图表本身的标签)。请注意,x轴是相反的,并且它突然将其缩放加倍到2000单位(倒数厘米)以上。有没有办法强迫Gnuplot以这种方式绘制我的数据?到目前为止,我已设法提出以下脚本:
# Make an SVG of size 800x500
set terminal svg size 800,500 fname 'CMU Sans Serif' fsize '10'
set output 'ir.svg'
# Color definitions
set border linewidth 1.5
set style line 1 lc rgb '#a0a0a0' lt 1 lw 2 pt 7 # gray
# Format graph
unset key
set xlabel 'Wavenumbers'
set ylabel 'Transmittance'
set xrange [4000:300]
# Plot data
plot 'spectrum.dat' with lines ls 1
这很好地反转了x轴,但我无法弄清楚如何以这种不寻常的方式改变缩放。
答案 0 :(得分:5)
作为化学家,我有动力回答......
据我所知,gnuplot不容易允许任意轴缩放(除非有人对如何使用set link
有明确的想法)。我在这种情况下的策略是分别绘制两半并使它们无缝连接:
#!/usr/bin/env gnuplot
set terminal png size 800,500
set output 'ir.png'
set xlabel 'Wavenumbers' offset 20
set ylabel 'Transmittance'
set tics out nomirror
set key bottom right
set bmargin 4
set yrange [0:1]
set multiplot layout 1,2 title 'IR Spectrum of Cholesterol'
# left half of plot
set xrange [4000:2000]
set rmargin 0
set border 7
plot 'cholesterol.txt' notitle
# right half of plot
set xrange [1999:300]
set lmargin 0
set rmargin 2
set border 13
unset xlabel
unset ylabel
unset ytics
plot 'cholesterol.txt' title 'Cholesterol'
unset multiplot
我的一个狡辩是,2000
被写了两次并且在我的屏幕上看起来更大胆,但我会把烦人的东西带给你。
答案 1 :(得分:5)
andyras的答案是一个很好的答案,就布局选项而言,这是一个可以说是更简单(更优雅的:-P)的解决方案。这也应该是一个更普遍的解决方案。如果没有太多的抽搐(如果有太多的数字,请在下图中读取),那么可以将曲线本身缩放到2000以上,然后手动添加所有抽搐。由于我没有可用的红外光谱数据,我将使用虚拟文件“+”并将log(x)
绘制在4000到500之间:
xmax=4000 ; xmin = 500
pivot = 2000 ; rescfactor = 2.
rescale(x) = (x >= pivot ? x : pivot + rescfactor*(x-pivot))
set xrange [rescale(xmax):rescale(xmin)]
set xtics ("4000" 4000, "3000" 3000, "2000" 2000, \
"1500" rescale(1500), "1000" rescale(1000), "500" rescale(500))
plot "+" u (rescale($1)):(log($1)) w l
在您的情况下,您只需将log($1)
替换为2
或您正在绘制的任何内容。
在较新版本的gnuplot中(从4.4开始)添加抽搐可以使用循环自动完成:
xmax = 4000 ; xmin = 500 ; step = 500
set xtics (sprintf("%i",xmax) rescale(xmax)) # Add the first tic by hand
set for [i=xmin:xmax-step:step] xtics add (sprintf("%i",i) rescale(i))
从gnuplot 4.6开始,也可以使用for
构建不同的do for
构造:
do for [i=xmin:xmax-step:step] {set xtics add (sprintf("%i",i) rescale(i))}