使用gnuplot pm3d和pdf输出生成的图像中有问题的莫尔图案

时间:2013-09-20 23:58:49

标签: image pdf gnuplot antialiasing interpolation

我正在使用此处讨论的命令文件绘制数据: gnuplot contour line color: set style line and set linetype not working 我想提供不同的输出选项。 PNG效果很好,wxt终端也是如此,但是它们具有固定的分辨率,例如,当我在绘图上“放大”时,它变得更加颗粒化。

如果我使用pdf或pdfcairo作为终端,则生成的文件具有Moire模式。通过在pm3d命令中使用增加的插值量,可以减少观察到莫尔图案的图像中的区域。数据集中有许多点在径向上,但数据的角度集不多,所以我需要在“方向”中插入更多。使用无插值导致非常粗糙的pm3d图像,所以我一直在尝试0,20到20,20甚至20,40。不幸的是,即使很多插值也没有完全摆脱莫尔模式,使文件大小变大(例如PNG文件大约250kB但pdf文件超过11MB),因此渲染速度非常慢。我尝试用Adobe Acrobat Reader 10.1.8和GSview查看这些内容,结果是一样的。

我对使用pdf格式感兴趣,因为它无处不在,可以放大而不会过度丢失细节(与PNG不同)。

下面是我在不同插值级别的结果pdf输出中捕获模式的几个屏幕截图。第一个图像是png文件供参考,因为它没有显示莫尔图案,250kB文件大小。

PNG rendering - no Moire pattern

接下来,pdf输出没有pm3d插值,72kB文件大小: PDF output screenshot. No pm3d interpolation

接下来,pdf输出使用set pm3d map interpolate 0,20,文件大小为1861kB: PDF output screenshot. pm3d interpolate 0,20

接下来,pdf输出使用set pm3d map interpolate 10,20,文件大小为5942kB: PDF output screenshot. pm3d interpolate 10,20

最后,pdf输出使用set pm3d map interpolate 20,20,文件大小为11515kB: PDF output screenshot. pm3d interpolate 20,20

为什么为pdf输出生成这些Moire模式?有没有这个,这将允许我仍然有一个可以放大的矢量格式,而不会(很多)失去分辨率?

1 个答案:

答案 0 :(得分:1)

这不应该是一个解决方案,而是一个解释和一个可能的,虽然丑陋的解决方法。

有时会向gnuplot邮件列表报告此问题,但似乎与观看者有关。它与gnuplot创建曲面图的方式有关。它们被绘制为多边形,它们被缝合在一起。您展示的莫尔图案来自两个多边形之间的错误渲染。这取决于观众,观众设置和缩放系数。

最简单的示例,显示效果是以下Postscript文件:

%!PS-Adobe-2.0
50 50 moveto 50 0 rlineto 0 50 rlineto -50 0 rlineto closepath 0 setgray fill
100 50 moveto 50 0 rlineto 0 50 rlineto -50 0 rlineto closepath 0 setgray fill

保存此文件,例如作为moire.ps并查看,或将其转换为ps2pdf并查看。使用Acrobat reader 9.5.1,我看到以下内容:

enter image description here

Acrobat Reader的设置Preferences -> Page Display -> Enhance thin lines可以防止出现此问题,但会导致其他部分出现问题。

在我的系统(Debian)上,所有观看者都会显示此模式,mupdffirefoxghostscriptpdftocairo,libpoppler等等。

那么,该怎么办?对我自己,我使用以下解决方法。我splotpng高分辨率,稍后用plot ... with rgbimage重新读取该文件。然后你将热图作为位图,其余的是矢量图。在大多数情况下,这没有问题,因为无论如何,您都有一些分析有限的测量数据,您可以进行插值。

基于问题gnuplot contour line color: set style line and set linetype not working,以下是如何实现它:

reset 

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 cntrparam bspline
set cntrparam points 10
set cntrparam levels increment -6,-6,-24
set contour surface

set linetype 1 lc rgb "blue" lw 2 
set linetype 2 lc rgb "blue"
set linetype 3 lc rgb "black"
set linetype 4 lc rgb "orange"
set linetype 5 lc rgb "yellow"

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
set xrange[-r:r]
set yrange[-r:r]
set colorbox user origin 0.9,0.1 size 0.03,0.8

##################### start changes ##############
set autoscale fix
RES_X = 2000
RES_Y = 2000

save('settings.tmp')
set lmargin at screen 0
set rmargin at screen 1
set bmargin at screen 0
set tmargin at screen 1
unset colorbox

set terminal pngcairo size RES_X, RES_Y
set output '3d-polar-inc.png'
splot 'new_test.dat' nocontour

unset output
load('settings.tmp')

# mapping of the coordinates for the png plotting later
X0 = GPVAL_X_MIN
Y0 = GPVAL_Y_MIN
DX = (GPVAL_X_MAX - GPVAL_X_MIN)/real(RES_X)
DY = (GPVAL_Y_MAX - GPVAL_Y_MIN)/real(RES_Y)
C0 = GPVAL_CB_MIN
DC = GPVAL_CB_MAX - GPVAL_CB_MIN
C(x) = (x/255.0) * DC + C0

# now plot the png 
#set terminal pdfcairo size 10cm,10cm
#set output '3d-polar.pdf'
set terminal postscript eps color level3 size 10cm,10cm solid
set output '3d-polar-eps.eps'

set multiplot

set cbrange[GPVAL_CB_MIN:GPVAL_CB_MAX]
plot '3d-polar-inc.png' binary filetype=png \
     origin=(X0, Y0) dx=DX dy=DY \
     using (C($1)):(C($2)):(C($3)) \
     with rgbimage, \
     NaN with image t '' # hack for getting the colorbox

# plot the contours
unset surface
unset pm3d
splot 'new_test.dat' w l

###################### end changes #################

# 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

使用pdfcairo,这将提供一个1.7 MB的pdf文件,epslatex level3(此选项仅在4.7开发版中提供),您将获得一个1.5 MB的eps文件,可以使用{{ 1}}到136 KB的pdf文件。

另请参阅我在TeX.SX上对Big data surface plots: Call gnuplot from tikz to generate bitmap and include automatically?的回答。