我正在尝试从一组指定z值的数据中绘制3D表面。虽然我设置了alpha = 1.0,但是我得到了一些奇怪的透明效果,在那里我可以看到表面。
当绘图和保存到文件时(包括png和pdf),都会出现人工制品:
我尝试更改线宽,并将步幅数从1更改为10(在后一种情况下,由于分辨率太粗糙,表面不可见)。
问:我如何摆脱这种透明度?
这是我的代码:
import sys
import numpy as np
import numpy.ma as ma
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
y_label = r'x'
x_label = r'y'
z_label = r'z'
x_scale = 2.0*np.pi
y_scale = 2.0*np.pi
y_numPoints = 250
x_numPoints = 250
def quasiCrystal(x, y):
z = 0
for i in range(0,5):
z += np.sin(x * np.cos(float(i)*np.pi/5.0) +
y * np.sin(float(i)*np.pi/5.0))
return z
x = np.linspace(-x_scale, x_scale, x_numPoints)
y = np.linspace(-y_scale, y_scale, y_numPoints)
X,Y = np.meshgrid(x,y)
Z = quasiCrystal(X, Y)
f = plt.figure()
ax = f.gca(projection='3d')
surf = ax.plot_surface( X, Y, Z,
rstride=5, cstride=5,
cmap='seismic',
alpha=1,
linewidth=0,
antialiased=True,
vmin=np.min(Z),
vmax=np.max(Z)
)
ax.set_zlim3d(np.min(Z), np.max(Z))
f.colorbar(surf, label=z_label)
ax.set_xlabel(x_label)
ax.set_ylabel(y_label)
ax.set_zlabel(z_label)
plt.show()
答案 0 :(得分:6)
Matplotlib不是一个“真正的”3D引擎。这是一个众所周知的问题,偶尔会出现与您类似的问题(请参阅this和this)。问题是同样的人工制品可能会产生似乎不同的问题。我相信你就是这种情况。
在继续我的建议之前,我只需quote this information from the maplotlib website:
我的3D绘图在某些视角看起来不正确
这可能是mplot3d最常报道的问题。问题是 从某些视角来看,3D物体会出现在前面 另一个对象,即使它在身体后面。这个可以 导致情节看起来“不正确”。
不幸的是,虽然正在做一些工作来减少事故的发生 这个神器,它目前是一个棘手的问题,不能 完全解决,直到matplotlib支持的3D图形渲染 的芯强>
由于3D数据减少到2D +而出现问题 z阶标量。单个值表示所有人的第三维 集合中3D对象的一部分。因此,当边界 两个集合的盒子相交,这就成了可能 工件发生。此外,两个3D对象的交集 (如多边形或补丁)无法正确渲染 matplotlib的2D渲染引擎。
在添加OpenGL支持之前,此问题可能无法解决 对所有后端(非常欢迎补丁)。在那之前,如果 您需要复杂的3D场景,我们建议您使用MayaVi。
It seems that Mayavi has finally moved on to Python 3,所以它当然有可能。如果你想坚持matplotlib用于这种情节我的建议是你使用rstride和cstride值来看看哪些产生了令你满意的情节。
surf = ax.plot_surface( X, Y, Z,
rstride=5, cstride=5,
cmap='jet',
alpha=1,
linewidth=0,
antialiased=True,
vmin=0,
rstride=10,
cstride=10,
vmax=z_scale
)
其他可能性是尝试查看其他类型的3D图表是否做得更好。查看plot_trisurf,contour或contourf。我知道它不理想,但在过去我也设法circumvent other type of artefacts using 3D polygons。
很抱歉没有更满意的答案。也许其他SO用户有更好的解决方案。祝你好运。
答案 1 :(得分:4)
我遇到了一些类似的问题,发现它们是抗锯齿工件,可以通过在antialiased=False
中设置plot_surface
来解决。