如何解决gnuplot中colorbox缺失色块的问题

how to fix the problem of the missing color pieces in the colorbox in gnuplot

我遇到一个问题,当我使用gnuplot绘制地图时,地图附近会有一个颜色框,看起来很奇怪。我把彩盒炸开,发现有漏色的,如下图。如何为颜色框填充颜色?

这是我在 gnuplot 中使用的终端类型和调色板。

set terminal postscript portrait color enhanced 12
set palette defined (-6.0 "#1B66B1",\
                     -4.8 "#1B66B1",\
                     -4.8 "#2A85DF",\
                     -3.6 "#2A85DF",\
                     -3.6 "#5FA3E7",\
                     -2.4 "#5FA3E7",\
                     -2.4 "#95C2EF",\
                     -1.2 "#95C2EF",\
                     -1.2 "#C9E0F7",\
                     -0.120000 "#C9E0F7",\
                     0.0 "#FFFFFF",\
                     0.0 "#FFFFFF",\
                     0.120000 "#F6D5CB",\
                     1.2 "#F6D5CB",\
                     1.2 "#EDAB96",\
                     2.4 "#EDAB96",\
                     2.4 "#E48062",\
                     3.6 "#E48062",\
                     3.6 "#DC562E",\
                     4.8 "#DC562E",\
                     4.8  "#AE3F1E",\
                     6.0  "#AE3F1E")

ps 文件没有 gaps。如果将其导出为 png,您可能会得到一些伪像,但这是 ps 文件处理程序的问题,而不是文件本身的问题。你可以通过要求 Gnuplot 生成一个更简单的 eps 来避免这种行为,它不会在你最喜欢的 eps 编辑器上失败,或者你改变你处理 eps.[=16 的方式=]

将调色板更改为更简单的东西

您可以通过调色板的maxcolors选项来定义不同颜色的最大数量。这会生成不超过 maxcolors 种可能的颜色,但它们是等距的。

set terminal postscript portrait color enhanced 12
set o "discrete.eps"
set palette defined (-6.0 "#1B66B1",\
                     -4.8 "#2A85DF",\
                     -3.6 "#5FA3E7",\
                     -2.4 "#95C2EF",\
                     -1.2 "#C9E0F7",\
                     0.0 "#FFFFFF",\
                     1.2 "#F6D5CB",\
                     2.4 "#EDAB96",\
                     3.6 "#E48062",\
                     4.8 "#DC562E",\
                     6.0 "#AE3F1E") maxcolors 11
set samples 20
set isosamples 20
splot sin(sqrt(x**2+y**2))/sqrt(x**2+y**2) w pm3d

在检查颜色条时,您会注意到在我使用 Inkscape 创建 png 后呈现在 png 上的小间隙(但在 eps 中没有):

保留原来的调色板,但改变处理 e 的方式ps

如果保留原始调色板,它会生成数百种颜色可能性,但大多数颜色会根据您在调色板中引入的阶梯式函数发生碰撞。

set terminal postscript portrait color enhanced 12
set o "discrete.eps"
set palette defined (-6.0 "#1B66B1",\
                     -4.8 "#1B66B1",\
                     -4.8 "#2A85DF",\
                     -3.6 "#2A85DF",\
                     -3.6 "#5FA3E7",\
                     -2.4 "#5FA3E7",\
                     -2.4 "#95C2EF",\
                     -1.2 "#95C2EF",\
                     -1.2 "#C9E0F7",\
                     -0.12 "#C9E0F7",\
                     -0.12 "#FFFFFF",\
                     0.12 "#FFFFFF",\
                     0.12 "#F6D5CB",\
                     1.2 "#F6D5CB",\
                     1.2 "#EDAB96",\
                     2.4 "#EDAB96",\
                     2.4 "#E48062",\
                     3.6 "#E48062",\
                     3.6 "#DC562E",\
                     4.8 "#DC562E",\
                     4.8 "#AE3F1E",\
                     6.0 "#AE3F1E")
set samples 20
set isosamples 20
splot sin(sqrt(x**2+y**2))/sqrt(x**2+y**2) w pm3d
set o
set term wxt

使用不同的编辑器打开 eps 看看它的样子。使用 gimp,你会得到类似下图的东西。

如果您先使用 Inkscape,它可以原生处理 eps,它可以生成工件。

您可以使用 ghostscript 的 ps2pdf 将 eps 转换为 pdf。

这是对 DanielTuzes 的回答的评论,而不是单独的回复。

两个实心填充矩形之间的边界处可能透明、可能变色的伪像问题是 PostScript/PDF 渲染程序和查看器中反复出现的问题。

这并不是 gnuplot 的错(*.eps 可以 正确呈现,只是许多呈现实用程序有问题)。但是,gnuplot 中有一种方法可以抑制这些伪像。在开发版本和即将发布的 gnuplot 版本 5.4.3 中,它使用新关键字选择:

#gnuplot 5.4.3
set pm3d border retrace

在此之前存在相同的选项但未记录且没有单独的关键字:

#gnuplot versions prior to 5.4.3
set pm3d border lt -6

此变通方法会绘制额外的线条以覆盖填充边界上的潜在瑕疵,其缺点是会使输出文件变大。