gnuplot轮廓线颜色:设置样式线和设置线型不起作用

时间:2013-09-18 17:02:18

标签: colors gnuplot contour

我正在绘制数据,如前一个Stackoverflow问题所述: gnuplot 2D polar plot with heatmap from 3D dataset - possible? 它主要适用于我,我对一些小细节很感兴趣。其中之一是如何控制轮廓线颜色和线宽。网上有很多帖子关于使用set style increment user,然后通过set style line 1 lc rgb "blue" lw 2等定义用户风格。理论上,这应该强制使用新定义的样式绘制线条。我尝试过它并没有用。另外,当我通过我的gnuplot安装进入帮助页面时,我发现这个用法已被我的版本弃用(版本4.7补丁级别0最后修改2013-07-25)。建议使用set linetype,它会为当前gnuplot的调用永久地更改gnuplot行样式的特征。杀死并重新启动gnuplot会恢复默认的线型特征。

接下来,我重新启动了gnuplot,重新生成了绘图,没有重新定义轮廓线的任何线型或类型。当我查看我的情节时,我可以看到线条颜色以青色开始,然后是紫色,然后是蓝色(例如类似线条类型5,4,3或14,13,12等)。似乎线型通过可用的样式进入BACKWARDS。好吧,我想,我可以改变那些并与奇怪的行为一起生活。但是,在发出多个set linetype命令后,将所有这些行类型更改为明显不同的内容(我通过运行test命令验证了这些),绘图上的轮廓线仍然具有相同的颜色和线宽和以前一样。我似乎无法弄清楚轮廓线的线型是什么,所以我无法改变相应的线型。

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

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

底线是我需要将某种样式应用于每个轮廓级别使用的轮廓线。我希望在输入数据更改时始终对每个级别使用相同的样式。该图总是使用相同的轮廓水平集:-6,-12,-18和-24。绘图数据的最大“z”坐标总是约为0,并从那里开始减少。

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

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

polar sonogram with default contour line styles

3 个答案:

答案 0 :(得分:6)

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

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

默认设置

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

  2. 撤消该操作
  3. 所有轮廓的linewidth都相同,也等于用于绘图命令的linewidth,以改变它的使用,例如splot 'new_test.dat' lw 3

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

    使用线条样式

    1. 轮廓使用linestyle,其索引比绘图命令使用的索引高一个。

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

    3. linewidth来自第一个linestyle,以下lw中的所有ls设置都会被忽略。

    4. 使用自定义线型

      1. 轮廓使用linetype,其索引比绘图命令使用的索引高一个。

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

      3. linestylereset 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 ' ' 相同。

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

        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

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

        enter image description here

        要将此用作完整脚本,只需在{{1}}命令之前直接加载其中一个文件。这给出了输出:

        enter image description here

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

答案 1 :(得分: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是一个不断发展的工具,他会详细了解它。

答案 2 :(得分:1)

作为一种快速,肮脏但简单的解决方案,有时我只将所有颜色与一种颜色相关联:

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