如何改进Gnuplot中渐变和填充元素的渲染?

如何改进Gnuplot中渐变和填充元素的渲染?,gnuplot,gradient,fill,Gnuplot,Gradient,Fill,我注意到Gnuplot在处理填充元素时会产生丑陋的人工制品 下图的调色板中有一个实例: 另一个例子是在从ASCII文件中的点定义的两条曲线之间使用填充曲线时。在这种情况下,您可以看到,该区域不是线之间的真实实体填充,而是填充了大量条带,这些条带仅在放大相当一点后才变得明显,但在将图像光栅化为png或类似格式时会产生非常强的影响: 这在终端上似乎是独立的。我试过postscrip,pdfcairo甚至tikz。是否可以采取任何措施来改进这一点,或者这是Gnuplot的一个硬限制?不幸的是,当两

我注意到Gnuplot在处理填充元素时会产生丑陋的人工制品

下图的调色板中有一个实例:

另一个例子是在从ASCII文件中的点定义的两条曲线之间使用
填充曲线时。在这种情况下,您可以看到,该区域不是线之间的真实实体填充,而是填充了大量条带,这些条带仅在放大相当一点后才变得明显,但在将图像光栅化为png或类似格式时会产生非常强的影响:


这在终端上似乎是独立的。我试过
postscrip
pdfcairo
甚至
tikz
。是否可以采取任何措施来改进这一点,或者这是Gnuplot的一个硬限制?

不幸的是,当两个填充多边形相互接触时,这是由于文档查看器中的抗锯齿造成的一个瑕疵。这发生在
filled Curves
打印样式中,该样式构成了许多四边形的填充区域,也发生在
pm3d
样式中(正如您在显示相同工件的颜色框中所看到的)。另见 对于一个具体的演示案例

有一个变通办法,但是非常麻烦。您必须使用一些脚本生成填充多边形对象,填充该对象,使用
stats
确定范围,绘制空绘图(例如)

我假设您有一个包含三列的数据文件,您可以用

plot 'test.dat' using 1:2:3 with filledcurves
使用以下非常粗糙的python脚本

from __future__ import print_function
from numpy import loadtxt
import sys

M = loadtxt(sys.argv[1])
print('set object 1 polygon ', end='')
for i in range(0,len(M)):
    if (i == 0):
        print('from {0},{1} '.format(M[i][0], M[i][1]), end='')
    else:
        print('to {0},{1} '.format(M[i][0], M[i][1]), end='')
for i in range(len(M)-1,-1,-1):
    print('to {0},{1} '.format(M[i][0], M[i][2]), end='')
可以使用绘制填充曲线

# determine the autoscaling ranges
set terminal push
set terminal unknown
plot 'test.dat' using 1:2, '' using 1:3
set terminal pop

set xrange [GPVAL_X_MIN:GPVAL_X_MAX]
set yrange [GPVAL_Y_MIN:GPVAL_Y_MAX]
eval(system('python script.py test.dat'))
set object 1 polygon fillstyle solid noborder fillcolor rgb 'red'
plot NaN notitle

这还不能解决锯齿色配色箱的问题:(

图片很好!不幸的是,您对此人工制品无能为力。当两个多边形相互接触时,它们会出现。使用pm3d绘制
时也会出现这种情况,请参见中的说明。但是,这种解决方法在您的情况下不起作用。我的待办事项列表中的填充曲线也有同样的问题,因为很长一段时间了时间…我使用的一个解决方法是编写一个python脚本,从数据文件生成多边形对象。可以稍后发布。好的,我们的想法是对数据进行预处理,从三列中创建多边形,并用填充曲线绘制它,对吗?这会产生一个很好的填充吗?如果是的话,看起来这是一个好主意你是Gnuplot的开发者吗?是的,我为Gnuplot提供了一些功能和补丁:)如果您将每条曲线定义为多边形,并使用
将对象多边形从…设置为…设置为…
可以获得很好的填充效果。要创建这些多边形,您需要一个外部脚本(我的脚本在这里不需要,它是针对我的情况专门设置的)。但是,你不能使用
lc palette frac
,而且你也得不到颜色映射。因此,这个解决方案会很麻烦,但也不是不可能。在我写论文的过程中,这些非常相似的工件干扰了我很多,所以我走了很长的一段路。我一直想在代码中解决这个问题,但还没有。@Schorsch我试图给出一个答案合理的回答。感谢你详细的回答。我有一点意见。我们真的需要对象吗?使用脚本从两条曲线创建这样的多边形,然后使用简单的“绘图”手工数据,这不是一个更干净的解决方案。dat'u 1:2 w Filled curves“不,填充曲线总是将区域分解为四边形。如果我没记错的话,只有带有x1或x2选项的曲线不会出现这种情况。正确绘制区域需要更改内部gnuplot代码。但是上图(第一个)就是这样一个例子,它似乎工作得很好。我无论如何都要尝试确认。我不想这样做,但这周不可能。我会让你知道我的测试。如果你看到那些白线,也取决于查看器和缩放因子,我试过我的实验())。这是与上图中相同的数据,但是一条曲线(蓝色)用
ux1:Y1:Y2
绘制,橙色用
ux1:Y1
绘制,但是预处理了输入文件,以便我事先用两行shell脚本创建poligon。我从中了解到,Gnuplot根据列数对
plot w fc
使用不同的算法。事实上,我认为三列版本是“buggy”,可以安全地被另一个版本替换(在内部执行poligon构造,花了我两行代码)。