将 3D 表面保存为 pdf 时出现黑线:我怎样才能摆脱它们?

Posted

技术标签:

【中文标题】将 3D 表面保存为 pdf 时出现黑线:我怎样才能摆脱它们?【英文标题】:Black lines when saving 3D surface to pdf: How can I get rid of them? 【发布时间】:2015-04-23 11:46:00 【问题描述】:

我有以下代码来使用 ax.plot_surface 显示 3D 表面:

fig = plt.figure()
ax  = fig.gca(projection='3d')
X,Y = np.meshgrid(range(k_mean.shape[0]), range(k_mean.shape[1])) 
Z   = k_mean
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, linewidth=0., alpha=0.8, cmap=cm.nipy_spectral, antialiased=False, shade=False)
cset = ax.contour(X, Y, Z, zdir='z', offset=0, cmap=cm.nipy_spectral)
cset = ax.contour(X, Y, Z, zdir='x', offset=0, cmap=cm.nipy_spectral)
cset = ax.contour(X, Y, Z, zdir='y', offset=120, cmap=cm.nipy_spectral)

ax.set_xlim(0, 120)
ax.set_ylim(0, 120)
ax.set_zlim(0, 1)

fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show()
plt.savefig('3d.pdf', dpi=500)

在 Spyder 中显示的绘图是“正确的”,但 PDF 似乎忽略了linewidth=0.。我该如何解决?

Spyder 输出:

PDF 输出:

【问题讨论】:

这在***.com/questions/17766481/… 之前出现,但不清楚是否已修复 啊,非常感谢!我没找到那个! 【参考方案1】:

matplotlib github 认为这是已修复的,但该修复并未进入 v1.4.1,但将被放入 v1.4.3 https://github.com/matplotlib/matplotlib/issues/2247

【讨论】:

谢谢!我现在将我的 matplotlib 更新到最新版本 1.4.3,一切正常!【参考方案2】:

正如其他人所指出的,这与 pdf 后端中的错误有关,应该在最新版本的 matplotlib 中解决。

这是一种 hack / 变通方法,可以在旧版本中获得更吸引人的结果。您可以将 edgecolor 显式设置为完全透明:

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm,
        linewidth=0, antialiased=True, edgecolor=(0,0,0,0))

比较结果:

编辑:

正如 cmets 中所指出的,使用 alpha 关键字会覆盖边缘颜色的 alpha 值。因此,我们需要明确定义面部颜色的透明度。我能看到的最简单的方法是调整颜色图:

from matplotlib.colors import LinearSegmentedColormap

colors = np.array(cm.coolwarm(np.linspace(0,1,256)))
colors[:,3] = 0.6
cmap = LinearSegmentedColormap.from_list('alpha_cmap', colors.tolist())

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cmap,
        linewidth=0, antialiased=True, edgecolor=(0,0,0,0))

结果:

【讨论】:

万一有人尝试这样做(这似乎可行):除了设置 edgecolor 之外,此修复程序还需要排除 alpha 关键字参数 - 即使 apha=1.0 似乎也无法正常工作。 好点。 alpha 关键字覆盖(几乎?)所有 matplotlib 函数中的颜色特定 alpha 值。 @paddyg 我添加了一个如何为面部颜色添加透明度的示例。

以上是关于将 3D 表面保存为 pdf 时出现黑线:我怎样才能摆脱它们?的主要内容,如果未能解决你的问题,请参考以下文章

将 Excel 工作表导出到 PDF 文件时出现奇怪的 Powershell 行为

将 pdf 转换为图像时出现 Ghostscript 错误

如何解决利用aspose把word文档转换为pdf文档时出现乱码 C#

使用 ImageMagick 将 PNG 文件转换为 PDF 时出现粗糙的边缘

pdf打开错误之读取本文档时出现问题(14)

使用 Ghostscript 将 PDF 转换为打印支持的格式时出现“错误:/ioerror in --filter--”