在 gnuplot 中标记来自 table 的二维等高线图
labeling 2d contour plot from table in gnuplot
我需要使用带有数据的 gnuplot 创建二维等高线图 table。我不确定如何标记轮廓。
我不能使用点功能创建等高线标签,因为我想在等高线图上添加二维图。
下面是要复制以创建 2D 等高线图的代码。我的问题是如何使用数据 table.
创建标签
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
基于 运行 上面代码的样子。最后一列是我想让它成为等高线图的标签。
我想你想要这样的东西:
datafile = 'cont1.dat'
stats datafile nooutput
plot for [i=0: STATS_blocks-1] datafile index i title columnhead(3) w l
stats
命令收集有关数据文件的一些统计信息,特别是它计算块的数量。块之间由两条空行分隔,每个块对应不同的轮廓层级。
columnheads(3)
命令将每个块中第一行第三列中的条目作为标题。
不幸的是,在您的情况下,由于 columnhead
命令,第一行被解释为 header 行并跳过绘图。这会导致结果图中出现空白:
我建议进行一些预处理以在不使用第一条数据线的情况下生成 header 行。对我有用的最简单的事情是删除每个块开始的注释行开头的 #
。我在 Linux,所以我使用 sed
:
sed "s/# Contour/Contour/" -i cont1.dat
这可以从 gnuplot 调用,最终脚本如下所示:
reset
# We need the datafile several times
datafile = 'cont1.dat'
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
# Generate data
set contour base
set cntrparam levels disc 450,250,150,100,60,30,10,2
set view map
unset surface
set table datafile
splot f(x,y)
unset table
# Count blocks
stats datafile nooutput
system("sed \"s/# Contour/Contour/\" -i ".datafile)
# Plot each data block separatly and set the title to
# the first entry of the third column of the respective block
plot for [i=0: STATS_blocks-1] datafile index i title columnhead(4) w l
一个缺点:sed
命令后的数据文件包含一些无效行 "Contour 0, label:",没有注释散列 # 和标签号。它们被 gnuplot 忽略,因为它们不包含有效数据。
我不清楚你是在谈论等高线的 "labels" 还是等高线的 "keys"(或图例)。
这是两种可能性的最小化示例。我假设您刚刚选择了一个用于演示目的的函数,但您的数据将来自文件。
避免曲线间隙(没有外部脚本)的一个技巧是跳过 5 行和 set datafile commentschar " "
并取 columnheader(5)
。然后像 # Contour 0, label: 2
这样的行被认为是第 5 列是您的键的数据。显然,尽管 commentschar 设置为 space.
,但实际数据仍(或幸运地)未被解释为注释
代码:
### 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
)。
我需要使用带有数据的 gnuplot 创建二维等高线图 table。我不确定如何标记轮廓。
我不能使用点功能创建等高线标签,因为我想在等高线图上添加二维图。
下面是要复制以创建 2D 等高线图的代码。我的问题是如何使用数据 table.
创建标签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
基于 运行 上面代码的样子。最后一列是我想让它成为等高线图的标签。
我想你想要这样的东西:
datafile = 'cont1.dat'
stats datafile nooutput
plot for [i=0: STATS_blocks-1] datafile index i title columnhead(3) w l
stats
命令收集有关数据文件的一些统计信息,特别是它计算块的数量。块之间由两条空行分隔,每个块对应不同的轮廓层级。
columnheads(3)
命令将每个块中第一行第三列中的条目作为标题。
不幸的是,在您的情况下,由于 columnhead
命令,第一行被解释为 header 行并跳过绘图。这会导致结果图中出现空白:
我建议进行一些预处理以在不使用第一条数据线的情况下生成 header 行。对我有用的最简单的事情是删除每个块开始的注释行开头的 #
。我在 Linux,所以我使用 sed
:
sed "s/# Contour/Contour/" -i cont1.dat
这可以从 gnuplot 调用,最终脚本如下所示:
reset
# We need the datafile several times
datafile = 'cont1.dat'
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
# Generate data
set contour base
set cntrparam levels disc 450,250,150,100,60,30,10,2
set view map
unset surface
set table datafile
splot f(x,y)
unset table
# Count blocks
stats datafile nooutput
system("sed \"s/# Contour/Contour/\" -i ".datafile)
# Plot each data block separatly and set the title to
# the first entry of the third column of the respective block
plot for [i=0: STATS_blocks-1] datafile index i title columnhead(4) w l
一个缺点:sed
命令后的数据文件包含一些无效行 "Contour 0, label:",没有注释散列 # 和标签号。它们被 gnuplot 忽略,因为它们不包含有效数据。
我不清楚你是在谈论等高线的 "labels" 还是等高线的 "keys"(或图例)。 这是两种可能性的最小化示例。我假设您刚刚选择了一个用于演示目的的函数,但您的数据将来自文件。
避免曲线间隙(没有外部脚本)的一个技巧是跳过 5 行和 set datafile commentschar " "
并取 columnheader(5)
。然后像 # Contour 0, label: 2
这样的行被认为是第 5 列是您的键的数据。显然,尽管 commentschar 设置为 space.
代码:
### 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
)。