How to add contour lines to a heat map

女生的网名这么多〃 提交于 2021-01-29 05:06:10

问题


I have a script which takes data (formatted in 3 columns x,y,z) and gives a heat map:

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

This is a 2D heat map, shown below:

All I want to do is add contours to this plot, at some z values such as -20 to -8 in in intervals of 2. Unfortunately, none of the answers I've found have been able to help me with this. Any help would be greatly appreciated.


回答1:


Although there are a lot of examples about contour on www.gnuplot.info, I couldn't find your exact case, because the examples are with functions, not with datablocks or data files (well, it should be similar). The following code does what you're asking for, but the construct '' u 1:2:3:("") w labels for adding labels still looks strange to me and doesn't allow for plotting boxed labels. In gnuplot console check help contour and help cntrparam.

Code:

### 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

Result:

Addition:

Here is another approach with plot w image instead of splot w pm3d. Although still not fully satisfying with the white label boxes on top of the contour lines. Adding an offset to the labels will not work for all labels at the same time. I'm not sure whether there is a way to just interrupt the contour lines for the labels.

Code:

### 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

Result:

Addition 2:

Another variation with colored contour lines and key instead of labels. This seems to be a bit cumbersome, I hope there is a simpler solution for this.

Code:

### 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

Result:



来源:https://stackoverflow.com/questions/63780145/how-to-add-contour-lines-to-a-heat-map

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!