首页 > 解决方案 > 从 gnuplot 中的表中标记 2d 等高线图

问题描述

我需要使用带有数据表的 gnuplot 创建一个 2D 等高线图。我不确定如何标记轮廓。

我无法使用 splot 功能创建等高线标签,因为我想在等高线图上添加 2D 图。

下面是复制代码以创建2D等高线图。我的问题是如何使用数据表创建标签。

reset
f(x,y)=(x**2+y-11)**2+(x+y**2-7)**2
set xrange [0:5]
set yrange [0:5]
set isosample 250, 250
set table 'test1.dat'
splot f(x,y)
unset table

set contour base
set cntrparam levels disc 450,250,150,100,60,30,10,2 
unset surface
set table 'cont1.dat'
splot f(x,y)
unset table


reset session

set terminal wxt size 800,600 enhanced font 'Verdana,10' persist


set style arrow 2 head nofilled size screen 0.03,15 ls 2 lc rgb "blue"

set xrange [0:5]
set yrange [0:5]
unset key
#set palette rgbformulae 33,13,10

p 'cont1.dat' w l lt -1 lw 1.5

这是cont1.dat基于运行上述代码的样子。最后一列是我想让它绘制等高线图的标签。

在此处输入图像描述

标签: plotgnuplotcontour

解决方案


我不清楚您是在谈论轮廓的“标签”还是轮廓的“键”(或图例)。这是两种可能性的最小化示例。我假设您刚刚为演示目的选择了一个函数,但您的数据将来自文件。

避免曲线间隙的一个技巧(没有外部脚本)是跳过 5 行set datafile commentschar " "并取columnheader(5). 然后将类似的行# Contour 0, label: 2视为数据,其中第 5 列是您的键。显然,尽管 commentschar 设置为空格,但实际数据仍然(或幸运地)未被解释为注释。

代码:

### contour lines with labels
reset session

f(x,y)=(x**2+y-11)**2+(x+y**2-7)**2

set xrange [0:5]
set yrange [0:5]
set isosample 250, 250

set contour base
set cntrparam levels disc 450,250,150,100,60,30,10,2 
unset surface
set table $Contour
    splot f(x,y)
unset table

set style textbox opaque noborder

set multiplot layout 2,1
    plot $Contour u 1:2 w l lw 1.5 notitle, '' u 1:2:3 every 50 w labels boxed notitle

    set datafile commentschar " "
    plot for [i=1:8] $Contour u 1:2:(i) skip 5 index i-1 w l lw 1.5 lc var title columnheader(5)
unset multiplot
### end of code

结果:

在此处输入图像描述

添加:

如果您添加该行

set key top left opaque box

并将绘图命令交换为:

plot for [i=1:8] $Contour u 1:2 skip 5 index i-1 w l lw 1.5 lc 0 dt i title columnheader(5)

您将获得以下信息:

请注意,只有 5 种预定义的破折号类型会重复,但是,您可以定义自己的破折号模式(请参阅 参考资料help dashtype)。

在此处输入图像描述


推荐阅读