8

我正在绘制数据,如上一个 Stackoverflow 问题中所述: gnuplot 2D polar plot with heatmap from 3D dataset - 可能吗? 大多数情况下它对我来说效果很好,我只关注一些小细节。其中之一是如何控制等高线颜色和线宽。网上有很多关于使用的帖子,set style increment user然后是用户风格的定义set style line 1 lc rgb "blue" lw 2等等。理论上,这应该强制 splot 使用新定义的样式绘制线条。我试过了,但没有用。此外,当我通过 gnuplot 安装访问帮助页面时,我发现我的版本已弃用此用法(版本 4.7 补丁级别 0 上次修改时间为 2013-07-25)。建议改用 set linetype,它会永久更改当前调用 gnuplot 的 gnuplot 线条样式的特征。杀死并重新启动 gnuplot 会恢复默认的线型特征。

接下来,我重新启动了 gnuplot,重新生成了绘图,而没有重新定义轮廓线的任何线条样式或类型。当我查看我的绘图时,我可以看到线条颜色以青色开始,然后是紫色,然后是蓝色(例如,线条类型 5、4、3 或 14、13、12 等)。似乎线条类型正在通过可用样式向后退。好吧,我想,我可以改变那些并忍受奇怪的行为。但是,在发出多个设置线型命令将所有这些线型更改为明显不同的东西之后(我通过运行test命令验证了这些,绘图上的等高线仍然具有与以前相同的颜色和线宽。我可以'似乎不知道轮廓线使用什么线型,所以我无法更改适当的线型。

也许这种奇怪的行为是轮廓线类型的结果,set cntrparam levels increment -6,-6,-24而负值和/或负增量导致一些不可预测的行为?

我想知道如何知道该图中的等高线将使用哪种线型,以及如果用于构建曲面图的线数发生变化,这是否会改变。例如,下图使用 13 条“线”生成曲面,使用set pm3d map. 因此,假设 N=13 行 - 第一个轮廓线型是否遵守规则?例如,我会始终确定等高线样式将从 N=14 开始吗?我想知道当我的输入数据中“线”的数量会发生变化时,第一条和后续等高线将使用哪种线型。

底线是我需要对用于每个轮廓级别的轮廓线应用某种样式。当输入数据发生变化时,我希望对每个级别始终使用相同的样式。该图将始终使用同一组等高线水平:-6、-12、-18 和 -24。绘图数据将始终具有大约 0 的最大“z”坐标并从那里减小。

Gnuplot 命令如下所示。该图的数据集可以在这里下载:http: //audio.claub.net/temp/new_test.dat

reset 
set terminal pngcairo size 800,800 
set output '3d-polar.png'

set lmargin at screen 0.05
set rmargin at screen 0.85
set bmargin at screen 0.1
set tmargin at screen 0.9

set pm3d map interpolate 20,20
unset key

set multiplot

# plot the heatmap

set cntrparam bspline
set cntrparam points 10
set cntrparam levels increment -6,-6,-24
set contour surface
#set style increment user           #NOTE: the commented out lines do not seem to affect color or width of the the contour lines no matter what number I use for the linetype
#set linetype 8 lc rgb "blue" lw 2
#set linetype 9 lc rgb "black" lw 1
#set linetype 10 lc rgb "orange" lw 1
#set linetype 11 lc rgb "yellow" lw 1

set palette rgb 33,13,10 #rainbow (blue-green-yellow-red)
set cbrange [-18:0]

unset border
unset xtics
unset ytics

set angles degree
r = 3.31 #This number is Log10(max frequency) - Log10(min frequency) of the polar frequency grid 
set xrange[-r:r]
set yrange[-r:r]
set colorbox user origin 0.9,0.1 size 0.03,0.8
splot 'new_test.dat'

# now plot the polar grid only
set style line 11 lc rgb 'black' lw 2 lt 0
set grid polar ls 11
set polar
set logscale r 10
set rrange[10:20000]
unset raxis
set rtics format '' scale 0
#set rtics axis scale 
set rtics (20,50,100,200,500,1000,2000,5000,10000,20000)
do for [i=-150:180:30] {
dum = r+0.15+0.05*int(abs(i/100))+0.05*int(abs(i/140))-0.05/abs(i+1)
set label i/30+6 at first dum*cos(i), first dum*sin(i) center sprintf('%d', i)
}
set label 20 at first 0, first -(log(20)/log(10)-1) center "20"
set label 100 at first 0, first -(log(100)/log(10)-1) center "100"
set label 200 at first 0, first -(log(200)/log(10)-1) center "200"
set label 1000 at first 0, first -(log(1000)/log(10)-1) center "1k"
set label 2000 at first 0, first -(log(2000)/log(10)-1) center "2k"
set label 10000 at first 0, first -(log(10000)/log(10)-1) center "10k"
set label 20000 at first 0, first -(log(20000)/log(10)-1) center "20k"
plot NaN w l
unset multiplot
unset output

无法控制等高线的图如下所示。我需要能够为轮廓线指定线条颜色和宽度。如何?

具有默认等高线样式的极谱图

4

3 回答 3

8

以下是如何更改等高线的线属性。我无法解释为什么会这样,我只是通过测试才发现的。不幸的是,没有关于这些细节的文档。

行为如下(用 4.6.3 和 4.7(2013-07-25 和 2013-09-09)测试,都显示相同的行为):

默认设置

  1. 如果linetype为 指定no splot,则曲面本身将使用lt 1。在这种情况下,第一个轮廓是用 绘制的lt 3。是的,与指定的增量相比,编号是向后的。但是您可以使用set cntrparam levels increment -6,-6,-18or来反转它set cntrparam levels increment -18,6,-6

  2. 所有轮廓的linewidth是相同的,也等于linewidth用于绘图命令的,要更改它,请使用splot 'new_test.dat' lw 3.

结果(没有较粗的线)如问题所示。

使用线条样式

  1. 等高线使用的linestyle索引比绘图命令使用的索引高一。

  2. 您还必须定义第一个linestyle,它将由表面使用。如果未定义此样式,则轮廓将回退到使用linetype.

  3. linewidth取自第一个,以下linestyle所有lw设置都将ls被忽略。

使用自定义线型

  1. 等高线使用的linetype索引比绘图命令使用的索引高一。

  2. 所有linetype必须定制的,也是第一个,表面使用的那个。否则使用默认设置。

  3. lw与 相同linestyle

为了进行测试,我使用了您的数据和以下精简脚本:

reset 
set terminal pngcairo size 800,800 
set output '3d-polar.png'

set lmargin at screen 0.05
set rmargin at screen 0.85
set bmargin at screen 0.1
set tmargin at screen 0.9

set pm3d map interpolate 20,20

# plot the heatmap
set cntrparam bspline
set cntrparam points 10
set cntrparam levels increment -6,-6,-18
set contour surface

set palette rgb 33,13,10
set cbrange [-18:0]

unset border
unset xtics
unset ytics

set angles degree
r = 3.31
set xrange[-r:r]
set yrange[-r:r]
set colorbox user origin 0.9,0.1 size 0.03,0.8

# load one of the following files:
#load 'linestyle.gp'
#load 'linetype.gp'

splot 'new_test.dat' title ' '

cbrange仅定义为,因此-18我相应地更改了轮廓级别(-24无论如何都没有绘制)。

我使用的两个“轮廓设置文件”是:

linetype.gp

set linetype 1 lc rgb "blue" lw 3
set linetype 2 lc rgb "black"
set linetype 3 lc rgb "orange"
set linetype 4 lc rgb "yellow"

linestyle.gp

设置样式增量用户

set style line 1 lc rgb 'blue' lw 3
set style line 2 lc rgb 'black'
set style line 3 lc rgb 'orange'
set style line 4 lc rgb 'yellow'

两者都给出相同的输出图像:

在此处输入图像描述

要将它用于您的完整脚本,只需在splot命令之前直接加载两个文件之一。这给出了输出:

在此处输入图像描述

在您提出关于轮廓的第一个问题之后,我正要提交一份错误报告,但结果却很难将其归结为具体问题。有了这个问题,可能会更容易。我会看看我是否有时间来做这件事。

于 2013-09-18T19:59:12.830 回答
2

当我再次做一些 GNUplot 绘图时,我不得不参考这个问题,这次是在直角坐标中,发现无法回忆如何控制等高线的线型。

我发现上面的信息现在不太正确,我找到了一种方法来解释它是如何从 GNUplot 版本 5 补丁级别 3 开始工作的。

我发现控制等高线的三个东西:1. 'set cntrparam levels increment' 命令,2. 命令'set style increment user',以及 3. 线条样式列表(我使用了'set style ' 命令)

事实证明这有点棘手。让我从我自己的代码中举一两个例子:

#HOW TO CONTROL LINE COLOR AND WIDTH FOR CONTOUR LINES:
#the number of contour lines and their level is controlled using the 'set cntrparam' command, above
#the 'set cntrparam' has the format 'start,increment,end' for the line positions
#note that the end level is listed at the top of the key/legend for the lines!
#line style 1 is used elsewhere, not for contour lines
#line style 2 is used for the style of the last line (e.g. end, or the last one drawn)
#line styles for other lines begins further down the list of styles and works UPWARDS to line style 2
#example 1: three lines at -40, -30, and -20
#   set cntrparam levels increment -20,-10,-40
#   set style line 1 lw 0.5 lc "grey30" 
#   set style line 2 lw 0.5 lc "blue"
#   set style line 3 lw 0.5 lc "white"
#   set style line 4 lw 0.5 lc "red"
# This results in:
#   -20 line color is RED
#   -30 line color is WHITE
#   -40 line color is BLUE
#
#example 2: four lines at -35, -30, -25, and -20
#   set cntrparam levels increment -20,-5,-35
#   set style line 1 lw 0.5 lc "grey30" 
#   set style line 2 lw 0.5 lc "blue"
#   set style line 3 lw 0.5 lc "white"
#   set style line 4 lw 0.5 lc "red"
#   set style line 5 lw 0.5 lc "yellow"
# This results in:
#   -20 line color is YELLOW
#   -25 line color is RED
#   -30 line color is WHITE
#   -35 line color is BLUE

我希望其他人会发现这很有用且内容丰富。也许 Christoph(如果他碰巧读过这个帖子)可以发表评论,因为 GNUplot 是一个不断发展的工具,他会详细了解它。

于 2016-06-05T01:01:46.037 回答
1

作为一种快速而肮脏但简单的解决方案,我有时只将所有内容与一种颜色联系起来:

设置为 [i=1:8] 线型 i 线色 0

于 2020-11-22T13:59:35.303 回答