将3D表面保存为pdf时出现黑线:如何摆脱它们?

时间:2015-04-23 11:46:00

标签: matplotlib export surface

我有以下代码使用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输出: Spyder output

PDF输出: PDF output

2 个答案:

答案 0 :(得分:3)

matplotlib github认为这是固定的但是修复程序没有进入v1.4.1但是会被放入v1.4.3 https://github.com/matplotlib/matplotlib/issues/2247

答案 1 :(得分:3)

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

这是黑客/解决方法,以便在旧版本中获得更具吸引力的结果。您可以将edgecolor显式设置为完全透明:

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

比较结果: enter image description here enter image description here

编辑:

正如评论中所指出的,使用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))

结果: enter image description here