Gnuplot 使用splot填充三维直线下方的区域

Gnuplot 使用splot填充三维直线下方的区域,gnuplot,Gnuplot,我正在绘制一个3D“围栏图”,每个围栏有多种颜色。我的样本数据可以在这里找到: 我使用以下方法绘制此数据: colors = "red red red red red" splot for [i=1:words(colors)] 'input.sep.txt' index i u 2:1:3 w lines lc rgb word(colors,i) 这条线画得没有问题,我相信画得正确。我的问题是:如何填充线条下方,使其看起来像一堵实心墙(即一直填充到0 z值)?我尝试使用w pm3d,但是

我正在绘制一个3D“围栏图”,每个围栏有多种颜色。我的样本数据可以在这里找到:

我使用以下方法绘制此数据:

colors = "red red red red red"
splot for [i=1:words(colors)] 'input.sep.txt' index i u 2:1:3 w lines lc rgb word(colors,i)

这条线画得没有问题,我相信画得正确。我的问题是:如何填充线条下方,使其看起来像一堵实心墙(即一直填充到0 z值)?我尝试使用
w pm3d
,但是这实际上并没有在轴上绘制任何可见的图形。

这是一种解决方法,而不是一种合适的解决方案,但它可能适合您。使用
filledcurves
选项,该选项并非真正设计用于三维打印。你所拥有的,实际上是这样的:

colors = "red red red red red"
splot for [i=1:words(colors)] 'input.sep.txt' index i u 2:1:3 w filledcurve lc rgb \
word(colors,i), for [i=1:words(colors)] 'input.sep.txt' index i u 2:1:3 w l lc "black" lw 2

使用带有
set dgrid3d
命令的技巧,可以增加绘制的垂直线数(
set dgrid3d 100,2
):

直到您对结果满意为止(
设置dgrid3d 200,2
):


这是一个变通办法,而不是一个合适的解决方案,但它可能适合您。使用
filledcurves
选项,该选项并非真正设计用于三维打印。你所拥有的,实际上是这样的:

colors = "red red red red red"
splot for [i=1:words(colors)] 'input.sep.txt' index i u 2:1:3 w filledcurve lc rgb \
word(colors,i), for [i=1:words(colors)] 'input.sep.txt' index i u 2:1:3 w l lc "black" lw 2

使用带有
set dgrid3d
命令的技巧,可以增加绘制的垂直线数(
set dgrid3d 100,2
):

直到您对结果满意为止(
设置dgrid3d 200,2
):


最好的选择是使用
pm3d
。为此,您必须稍微更改数据文件:您必须复制每一行,将复制的z值更改为
0
,并添加新行,即前两行数据

1 1 2
2 1 4
必须成为

1 1 2
1 1 0

2 1 4
2 1 0
等等。以后仍然需要两个连续的空行来分隔不同的“墙”

如果可以控制数据输出,可以更改输出例程,也可以使用命令行工具,如
sed

sed 's/^\([0-9]* [0-9]* \)\(.*\)$/&\n\1 0\n/' gistfile1.txt
awk

awk '1; {print $1,$2,0,"\n"}' gistfile1.txt
进行转换。当然,这可以在gnuplot内部动态完成。完整的工作脚本是:

filename = 'gistfile1.txt'
sed = '< sed ''s/^\([0-9]* [0-9]* \)\(.*\)$/&\n\1 0\n/'' '

set autoscale cbfix
set palette defined (0 'red', 1 'blue')
set pm3d depthorder
unset colorbox
unset key
set ticslevel 0
splot sed.filename using 1:2:3:(column(-2)) with pm3d
filename='gistfile1.txt'
sed=“
使用gnuplot 4.6.5和示例数据得到的结果是:

一些补充说明:

  • 第四列用于为着色选择与z值不同的值
  • 列(-2)
    使用块编号(相邻块由两条空行分隔)作为颜色索引
  • 不连接属于不同数据块的点
  • 使用
    set autoscale cbfix
    可以更好地控制用于平面的颜色
  • 如果您知道,例如,您有三个应该具有特定颜色的平面,您也可以使用
    设置调色板定义(0'红色'、1'绿色'、2'蓝色)

    • 最好的选择是使用
      pm3d
      。为此,您必须稍微更改数据文件:您必须复制每一行,将复制的z值更改为
      0
      ,并添加新行,即前两行数据

      1 1 2
      2 1 4
      
      必须成为

      1 1 2
      1 1 0
      
      2 1 4
      2 1 0
      
      等等。以后仍然需要两个连续的空行来分隔不同的“墙”

      如果可以控制数据输出,可以更改输出例程,也可以使用命令行工具,如
      sed

      sed 's/^\([0-9]* [0-9]* \)\(.*\)$/&\n\1 0\n/' gistfile1.txt
      
      awk

      awk '1; {print $1,$2,0,"\n"}' gistfile1.txt
      
      进行转换。当然,这可以在gnuplot内部动态完成。完整的工作脚本是:

      filename = 'gistfile1.txt'
      sed = '< sed ''s/^\([0-9]* [0-9]* \)\(.*\)$/&\n\1 0\n/'' '
      
      set autoscale cbfix
      set palette defined (0 'red', 1 'blue')
      set pm3d depthorder
      unset colorbox
      unset key
      set ticslevel 0
      splot sed.filename using 1:2:3:(column(-2)) with pm3d
      
      filename='gistfile1.txt'
      sed=“
      使用gnuplot 4.6.5和示例数据得到的结果是:

      一些补充说明:

      • 第四列用于为着色选择与z值不同的值
      • 列(-2)
        使用块编号(相邻块由两条空行分隔)作为颜色索引
      • 不连接属于不同数据块的点
      • 使用
        set autoscale cbfix
        可以更好地控制用于平面的颜色
      • 如果您知道,例如,您有三个应该具有特定颜色的平面,您也可以使用
        设置调色板定义(0'红色'、1'绿色'、2'蓝色)

      嗨,米格尔,非常感谢您的详细回复。我见过一些类似的东西,但我希望有一个更优雅的解决方案。我最终想做一个所谓的“墙图”,如这里所述,但图的语法是如此的密集和复杂,以至于我很难理解它,这就是为什么我开始尝试绘制和填充一堵墙的原因。如果没有人给出更优雅的回答,我会给你分数并接受你的答案。非常感谢您的帮助,祝您度过愉快的一天。@dps除了彩色等高线图之外,我对
      splot
      不是很熟悉。很可能会有一个更规范(或者你所说的优雅)的解决方案。如果Christoph没有提出任何其他解决方案,那么这可能是一个很好的解决方案(至少在这种简单程度上)。嗨,米格尔,非常感谢你的详细回复。我见过一些类似的东西,但我希望有一个更优雅的解决方案。我最终想做一个所谓的“墙图”,正如这里所描述的,但是这个图的语法是如此的密集和复杂,以至于我很难理解它,这就是为什么我开始尝试绘制和填充一个罪恶