如何将轮廓线添加到热图

时间:2020-09-07 15:05:25

标签: plot gnuplot contour

我有一个脚本,该脚本用于获取数据(格式为x,y,z的3列)并提供热图:

set logscale x 10
set yrange [1e-9:2e-8]

set xlabel "x"
set ylabel "y"
set multiplot


plot 'filetest.dat' u 1:2:9 with image

这是2D热图,如下所示:

enter image description here

我要做的就是以2个间隔的z值(例如-20到-8)将轮廓添加到此绘图中,不幸的是,我没有找到任何答案可以帮助我。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

尽管www.gnuplot.info上有很多关于轮廓的示例,但我找不到您的确切情况,因为这些示例是函数而不是数据块或数据文件的(嗯,应该相似)。 以下代码可以满足您的要求,但是添加标签的结构'' u 1:2:3:("") w labels在我看来仍然很奇怪,并且不允许绘制装箱的标签。 在gnuplot控制台中,检查help contourhelp cntrparam

代码:

### pm3d with contour lines
reset session
set view equal xyz

# create some test data
set samples 40
set isosamples 40
set table $Data
    splot '++' u 1:2:($1*$2/2-9)
unset table

set view map
set contour base
set cntrparam levels incremental -20,2,-8
set cntrlabel font ",10"

set xrange[-5:5]
set yrange[-5:5]

splot $Data u 1:2:3 w pm3d notitle, '' u 1:2:3:("") w labels notitle
### end of code

结果:

enter image description here

添加:

这是使用plot w image而不是splot w pm3d的另一种方法。 尽管仍然不能完全满足轮廓线上方的白色标签框的要求。向标签添加偏移量将无法同时适用于所有标签。我不确定是否有办法只中断标签的轮廓线。

代码:

### heatmap with contour lines
reset session
set view equal xyz

# create some test data
set samples 40
set isosamples 40
set table $Data
    splot '++' u 1:2:($1*$2/2-9)
unset table

set view map
set contour base
set cntrparam levels incremental -20,2,-8
set cntrlabel font ",10"

set xrange[-5:5]
set yrange[-5:5]
set style textbox noborder opaque

# put contour lines in a separate datablock
unset surface
set table $Contour
   splot $Data u 1:2:3
unset table

plot $Data u 1:2:3 w image notitle, \
     $Contour u 1:2 w l lw 2 lc "black" not, \
     '' u 1:2:3 every 40::3 w labels boxed notitle
### end of code

结果:

enter image description here

添加2:

另一个带有彩色轮廓线和键而不是标签的变体。这似乎有点麻烦,我希望有一个更简单的解决方案。

代码:

### heatmap with colored contour lines
reset session
set view equal xyz

# create some test data
set samples 40
set isosamples 40
set table $Data
    splot '++' u 1:2:($1*$2/2-9)
unset table

set view map
set contour base
set cntrparam levels incremental -20,2,-8

set xrange[-5:5]
set yrange[-5:5]
set style textbox noborder

# put contour lines in a separate datablock
unset surface
set table $Contour
   splot $Data u 1:2:3
unset table

# get contour levels unique and in sorted order
set table $Dummy
    plot $Contour u 3 w table
unset table
set table $ContourSorted
    plot $Dummy u 1 smooth freq
unset table
print $ContourSorted

set key out right Left

plot $Data u 1:2:3 w image notitle, \
     for [i=0:*] $Contour u 1:2:3 index i w l lw 2 lc i+1 not, \
     for [i=|$ContourSorted|-2:5:-1] $ContourSorted u (NaN):1 w l lw 2 lc |$ContourSorted|-i-1 ti word($ContourSorted[i],1)
### end of code

结果:

enter image description here