Gnuplot 使用splot填充三维直线下方的区域
我正在绘制一个3D“围栏图”,每个围栏有多种颜色。我的样本数据可以在这里找到: 我使用以下方法绘制此数据: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,但是
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'蓝色)
splot
不是很熟悉。很可能会有一个更规范(或者你所说的优雅)的解决方案。如果Christoph没有提出任何其他解决方案,那么这可能是一个很好的解决方案(至少在这种简单程度上)。嗨,米格尔,非常感谢你的详细回复。我见过一些类似的东西,但我希望有一个更优雅的解决方案。我最终想做一个所谓的“墙图”,正如这里所描述的,但是这个图的语法是如此的密集和复杂,以至于我很难理解它,这就是为什么我开始尝试绘制和填充一个罪恶