我正在尝试从一组指定z值的数据中绘制3D曲面。尽管设置了alpha = 1.0,但我还是得到了一些奇怪的透明度伪像,即使在其中也可以看到它的表面。

在打印时和保存到文件中时都存在伪像(均为png和pdf):
python - Matplotlib plot_surface透明度伪像-LMLPHP

我尝试过更改线宽,并将步幅数从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()

这是我的实际数据的另一张图片,在此图片中更容易看到伪像:
python - Matplotlib plot_surface透明度伪像-LMLPHP

最佳答案

Matplotlib不是“真正的” 3D引擎。这是一个众所周知的问题,有时会出现与您类似的问题(请参阅thisthis)。问题在于,同一人工制品可能会引发看起来不同的问题。我相信您就是这种情况。

在继续我的建议之前,先让我开始quote this information from the maplotlib website:



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_trisurfcontourcontourf。我知道它并不理想,但在过去我也设法circumvent other type of artefacts using 3D polygons

对不起,没有一个更满意的答案。也许其他SO用户对此有更好的解决方案。祝你好运。

关于python - Matplotlib plot_surface透明度伪像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39144482/

10-13 08:27