该图应仅显示屏蔽值.就像在右侧的(操纵)图中一样.
默认显示所有值.在2d图表中没有问题.
它是否也可以在3d图表中?如果是,怎么样?

import matplotlib.pyplot as plt
import numpy as np
Z = np.array([
[ 1, 1, 1, 1, 1, ],
[ 1, 1, 1, 1, 1, ],
[ 1, 1, 1, 1, 1, ],
[ 1, 1, 1, 1, 1, ],
[ 1, 1, 1, 1, 1, ],
])
x, y = Z.shape
xs = np.arange(x)
ys = np.arange(y)
X, Y = np.meshgrid(xs, ys)
M = np.ma.fromfunction(lambda i, j: i > j, (x, y))
R = np.ma.masked_where(M, Z)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, R)
#ax.plot_wireframe(X, Y, R)
#ax.plot_trisurf(X.flatten(), Y.flatten(), R.flatten())
fig.show()
Run Code Online (Sandbox Code Playgroud)
正如eric 的评论所指出的,问题已在 中解决matplotlib <= 3.5.0,并且 OP 中的代码按预期工作。所以现在,如果可以的话,最好的选择可能是更新 matplotlib。
对于更新 matplotlib 可能不可行的情况,原始答案留在这里。
坏消息是,它似乎plot_surface()只是忽略了面具。事实上,这是一个悬而未决的问题。
然而,他们在这里指出了一种解决方法,虽然它远非完美,但可能会让您获得一些可接受的结果。关键问题是NaN不会绘制值,因此您需要“屏蔽”不想绘制为 的值np.nan。
你的示例代码将变成这样:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
Z = np.array([
[ 1, 1, 1, 1, 1, ],
[ 1, 1, 1, 1, 1, ],
[ 1, 1, 1, 1, 1, ],
[ 1, 1, 1, 1, 1, ],
[ 1, 1, 1, 1, 1, ],
])
x, y = Z.shape
xs = np.arange(x)
ys = np.arange(y)
X, Y = np.meshgrid(xs, ys)
R = np.where(X>=Y, Z, np.nan)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, R, rstride=1, linewidth=0)
fig.show()
Run Code Online (Sandbox Code Playgroud)
*我必须将rstride=1参数添加到调用中plot_surface;否则我会遇到分段错误... o_O
结果如下:

| 归档时间: |
|
| 查看次数: |
1299 次 |
| 最近记录: |