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

发布于 2015-04-23 20:00:24
matplotlib github认为这个问题已经解决了,但是这个修复没有出现在v1.4.1中,但是将会出现在v1.4.3 https://github.com/matplotlib/matplotlib/issues/2247中
发布于 2015-04-23 20:32:00
正如其他人所指出的,这与pdf后端的一个bug有关,这个问题应该在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))比较结果:


编辑:
正如注释中指出的,使用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))结果:

https://stackoverflow.com/questions/29822498
复制相似问题