- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试根据一组指定 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()
最佳答案
Matplotlib 不是“真正的”3D 引擎。这是一个众所周知的问题,偶尔会出现与您类似的问题(请参阅 this 和 this)。问题在于,同一个人工制品可能会引发看似不同的问题。我相信你就是这种情况。
在继续我的建议之前,让我先说 quote this information from the maplotlib website :
My 3D plot doesn’t look right at certain viewing angles
This is probably the most commonly reported issue with mplot3d. The problem is that – from some viewing angles – a 3D object would appear in front of another object, even though it is physically behind it. This can result in plots that do not look “physically correct.”
Unfortunately, while some work is being done to reduce the occurance of this artifact, it is currently an intractable problem, and can not be fully solved until matplotlib supports 3D graphics rendering at its core.
The problem occurs due to the reduction of 3D data down to 2D + z-order scalar. A single value represents the 3rd dimension for all parts of 3D objects in a collection. Therefore, when the bounding boxes of two collections intersect, it becomes possible for this artifact to occur. Furthermore, the intersection of two 3D objects (such as polygons or patches) can not be rendered properly in matplotlib’s 2D rendering engine.
This problem will likely not be solved until OpenGL support is added to all of the backends (patches are greatly welcomed). Until then, if you need complex 3D scenes, we recommend using 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 用户对此有更好的解决方案。祝你好运。
关于python - Matplotlib plot_surface 透明度人工制品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39144482/
我试图了解如何构建用于 plot_surface(在 Axes3d 中)的数组。 我试图构建一个简单的表面处理这些数组的数据: In [106]: x Out[106]: array([[0, 0],
我尝试使用 Python 3 创建曲面图,现在我想知道为什么它是透明的?有任何想法吗?我希望它看起来像我使用相同数据集使用 MATLAB 创建的图 ETOPO1 .第二个问题,使用 plot_surf
我正在尝试制作 3D 绘图,因为 Wolfram 无法处理 eq.但Python似乎也有麻烦。我基本上使用了冲浪图示例:http://matplotlib.org/mpl_toolkits/mplot
我在尝试获取数据阵列的曲面图时遇到问题。 (请参阅下面的小测试数据样本)。 这是我用来测试我遇到的不同方法的基本代码。 import numpy as np import matplotlib.pyp
我正在尝试根据一组指定 z 值的数据绘制 3D 表面。尽管我设置了 alpha=1.0,但我得到了一些奇怪的透明人工制品,在那里我可以透过表面看到。 在绘图和保存到文件(png 和 pdf 格式)时都
我用 Python 中的一些数据绘制了曲面图。 现在我试图改变这样一个情节的风格。但不幸的是,我陷入了线条颜色。它默认为黑色,但我想将其设为红色或任何其他颜色。 我的代码是: from mpl_too
我已经修改了 mplot3d example code在保罗的帮助下我的申请。代码如下: from mpl_toolkits.mplot3d import Axes3D import matplotl
我正在尝试使用 matplotlib 绘制地形高程数据。我构建了一个 nx3 numpy 数组,每行包含我的点的 x、y、z 坐标(它们在 x、y 平面上的网格中有规律地间隔)。我试图用这段代码绘制它
我想将 MATLAB 中的 surf 命令转换为 matplotlib 中的 plot_surface 命令。 我面临的挑战是在 plot_surface 命令中使用 cmap 函数对曲面进行渐变
我有以下数据: https://www.dropbox.com/s/u7ee09chaixw5vb/draw?dl=0 在python3中使用pickle保存,它只是一个二维的python列表,形式为
我正在尝试做 this和我的 data具有以下结构: 0.90000000 0.90000000 -2133.80472139 0.90000000 0.95000000 -2133.84
我是 matplotlib 的新用户。使用 matplotlib 和 plot_surface 绘制曲面 (3D) 时,会出现一个带有图形的窗口。在该窗口中,右下角有鼠标实际位置的坐标。是否有可能访问
我有以下 python 代码,它显示以下 3D 图。 我的代码是: from mpl_toolkits.mplot3d import axes3d import matplotlib.pyplot a
我正在尝试使用 facecolors 以预定义的颜色为表面着色 3D。这里的问题是 cm.ScalarMappable 规范化表面 V 的颜色,而 plt.cm.jet 不规范化,因此颜色和颜色条不匹
我正在使用 MatPlotLib 的 plot_surface 方法生成 3D 表面,然后将其保存为 PDF 文件。我可以通过“linewidth=0”隐藏表面线条,但在保存为 PDF 后线条再次出现
我已经从一个文件创建了一个 3D 绘图表面,并且我正在尝试为该绘图制作动画。我已经阅读了 matplotlib 网页中的示例和 SO 中的其他示例,并注意到我需要创建一个更新函数来遍历文件中的值,然后
我有一些代码可以使用 matplotlib 在 Python 中绘制 3D 表面: import math import numpy as np import matplotlib.pyplot as
我尝试构建一个最小示例来重现我遇到的问题。请忽略随机生成的数据数组 x 和 y。我将非常有意义的数据输入到 plot_surface 内的 zSpline 调用中。您可以尝试将倒数第二行替换为 - s
我是一名优秀的程序员,十分优秀!