Gnuplot 三维绘图上的等高线,两种不同的数据范围

Gnuplot 三维绘图上的等高线,两种不同的数据范围,gnuplot,Gnuplot,我想3D绘制一个数据集,然后等高线将不同的数据集绘制成单个组合图。(对于感兴趣的人,等高线数据集与3Dplot的梯度相关)。代码调整正常,除了一个方面:如果我使用set zrange缩放3D绘图,轮廓就会消失。自动范围3Dplot看起来不太好,尽管轮廓看起来还可以,这就是为什么我想应用自定义范围。我怀疑这个问题也与等高线的范围有关,在某种程度上没有留下任何等高线。但是我对Gnuplot没有足够的经验来判断这是否是真的,或者如何解决这个问题 此代码 reset set ztics

我想3D绘制一个数据集,然后等高线将不同的数据集绘制成单个组合图。(对于感兴趣的人,等高线数据集与3Dplot的梯度相关)。代码调整正常,除了一个方面:如果我使用
set zrange
缩放3D绘图,轮廓就会消失。自动范围3Dplot看起来不太好,尽管轮廓看起来还可以,这就是为什么我想应用自定义范围。我怀疑这个问题也与等高线的范围有关,在某种程度上没有留下任何等高线。但是我对Gnuplot没有足够的经验来判断这是否是真的,或者如何解决这个问题

此代码

    reset
    set ztics 5
    #set zrange [10 : 25] #nowriteback
    set view 135,60
    set contour base #surface
    set cntrlabel font ",7"
    set datafile missing "NaN"
    set clabel
    
    set cntrparam levels discrete 0.3, 0.4, 0.6, 1.0, 1.5
    splot 'out011_Io.txt' nonuniform matrix with lines notitle nocontour, \
    'out011_FlxN.txt' nonuniform matrix with lines title "{/Symbol F}_{N}" enhanced nosurface
…创建此绘图:具有正常轮廓的过度平坦3D绘图

激活zrange时

reset
set ztics 5
set zrange [10 : 25] #nowriteback
set view 135,60
set contour base #surface
set cntrlabel font ",7"
set datafile missing "NaN"
set clabel

set cntrparam levels discrete 0.3, 0.4, 0.6, 1.0, 1.5
splot 'out011_Io.txt' nonuniform matrix with lines notitle nocontour, \
'out011_FlxN.txt' nonuniform matrix with lines title "{/Symbol F}_{N}" enhanced nosurface
…创建此绘图:良好的3D绘图,没有可见轮廓

原始数据可在此处找到:和


非常感谢知识渊博者的建议。

如果没有包括数据文件在内的最小示例,很难确定答案,但这可能是因为您的第二个文件的值超出了您想要为第一个文件设置的
zrange
。例如,代码:

set cntrparam levels discrete -.5,.5
set contour base
splot 10*(sin(x/3)*sin(y/3)+2), sin(x/3)*sin(y/3) nosurface
确实会生成等高线,但如果指定的
zrange
不包括
-0.5
和可能的
0.5
,这些等高线也不会显示。由于
splot
没有
axes
关键字(与
plot
相反),据我所知,您只需掌握一些技巧,使第二个文件中的数据适合第一个文件的数据范围。因为第一个的范围是
[10:25]
,第二个的范围是
[0.3:1.5]
,所以添加
10
是好的。但是,您必须“手动”生成关键帧,否则轮廓将被标记为
10.3、10.4、
。以下是更正后的代码:

reset
set ztics 5
set zrange [10 : 25] #nowriteback
set view 135,60
set contour base #surface
set cntrlabel font ",7"
set datafile missing "NaN"
set clabel

NSURFACES=1 #change if plotting more surfaces
SHIFT=10
LEVELS="10.3, 10.4, 10.6, 11.0, 11.5"
set cntrparam levels discrete @LEVELS
set style line 100 lc rgb "white"
splot 'out011_Io.txt' nonuniform matrix with lines notitle nocontour, \
  'out011_FlxN.txt' nonuniform matrix using 1:2:($3+SHIFT) with lines notitle enhanced nosurface, \
  for [i=0:words(LEVELS)] 1/0 w l ls (i==0)?100:i+NSURFACES  title (i==0)?"{/Symbol F}_{N}":sprintf(("%.1f"),word(LEVELS,i)-SHIFT)
注意:

  • 一个更干净的解决方案是在两个文件上都使用
    stats
    ,并计算应该向第二个文件添加的偏移量,而不是硬设置10
  • 从5.2版开始,您可以用cleaner
    keyentry
    关键字替换
    1/0

  • 如果选中帮助等高线,gnuplot将提供绘制等高线的选项

    set contour {base | surface | both}
    
    不幸的是,这不是您所要求的自定义级别。 因此,我对解决方案的建议如下:

  • 将数据和轮廓绘制到表格中,例如数据块
    $Cont
    。此数据块将包含数据和等高线(在您的示例5中)以及由2条空线分隔的每个子块
  • 未设置轮廓
  • 打印
    $Cont
    ,但第一个块除外。在您的情况下,通过
    索引1:5
  • 解释:

    for [i=1:LevelCount] $Cont u 1:2:(10):(column(-2)) index i w l lc var ti columnhead(3) 
    
    使用伪列
    (列(-2))
    确定的可变颜色
    lc var
    ,以恒定的z级
    (10)
    绘制
    $Cont
    的块1到块5,并将
    列头(3)
    作为关键字标题。显然,在您的情况下,只有4条等高线,即在
    0.3
    处没有等高线

    代码:

    ### contour plot at custom level
    reset session
    
    set contour base
    set cntrparam levels discrete 0.3, 0.4, 0.6, 1.0, 1.5
    set table $Cont
        splot "out011_FlxN2.txt" nonuniform matrix
    unset table
    unset contour
     
    set key at screen 0.16, screen 1 title "{/Symbol F}_{N}"
    set view 135,60
    set xyplane relative 0
    LevelCount = 5
    
    splot "out011_Io.txt" nonuniform matrix w l notitle, \
          for [i=1:LevelCount] $Cont u 1:2:(10):(column(-2)) index i w l lc var ti columnhead(3) 
    ### end of code
    
    结果:

    ### contour plot at custom level
    reset session
    
    set contour base
    set cntrparam levels discrete 0.3, 0.4, 0.6, 1.0, 1.5
    set table $Cont
        splot "out011_FlxN2.txt" nonuniform matrix
    unset table
    unset contour
     
    set key at screen 0.16, screen 1 title "{/Symbol F}_{N}"
    set view 135,60
    set xyplane relative 0
    LevelCount = 5
    
    splot "out011_Io.txt" nonuniform matrix w l notitle, \
          for [i=1:LevelCount] $Cont u 1:2:(10):(column(-2)) index i w l lc var ti columnhead(3) 
    ### end of code
    

    这是一个聪明的黑客,虽然很难看,但可以做需要做的事情。谢谢你的建议。然而,在我第一次尝试时,代码没有生成轮廓,尽管我同意它应该生成轮廓。我正在研究它,但与此同时,我的数字数据文件被发现为和。这是我的错误:现在在
    设置cntrparam
    中使用
    @LEVELS
    在计算命令之前阻止
    gnuplot
    将字符串转换为浮点。轮廓现在应该显示出来了。顺便说一句,你有没有更新你的graident文件,在每个地方添加10个?最好有一个using in plot命令,添加它(这是我回答的错误),如果文件已预移位,请使用
    SHIFT=0
    。这很有效,谢谢!我需要查看用户手册以确保我理解所使用的语法。也就是说,现在还有另一个问题:轮廓图例的颜色与实际轮廓不匹配。我得到的情节是这样的。等高线数据看起来像,所以实际上没有。我的Gnuplot v5.2似乎对
    set cntparam level discrete
    语句中指定的最右边的级别使用线型4,这也可以在要绘制等高线的数据中找到。它使用线型5,6,7。。。对于
    设置cntparam level discrete
    左侧/开头的等高线,只要在要绘制等高线的数据中也找到了该等高线。与上述相反,在图例中,Gnuplot使用线型2、3、4,从
    set-cntparam-level-discrete
    的最左边的值开始,检查是否在数据中找到该级别。如果我验证
    set-cntparam-discrete
    不包含在要轮廓化的数据中找不到的级别,并替换
    …(I==0)?100:I+nsurface标题(I==0)?“{/Symbol F}{N}”通过
    …(i==0)?100:NSURFACES+单词(LEVELS)+3-i标题(i==0)?“{/Symbol F}{N}”…
    ,图例绘制正确。这里反向设计的索引方案有点符合。我无法用您的数据和给定的代码完全复制第一个图形。我在第一张图中没有看到任何轮廓。您使用哪个版本的gnuplot?您的
    out011\u FlxN.txt
    数据值大约在10到180之间。gnuplot应该如何绘制0.3到1.5之间标高的等高线?你的数据或等级肯定有什么地方弄混了。@theozh,你所指的数据是加上数字10的,这是Joce建议的第一个黑客攻击。我的原始数据(没有添加10,即使用insted的移位变量)在中找到。我需要仔细检查代码,看看是否理解它是如何工作的,但绘图看起来很漂亮。谢谢。