如何使3d matlibplot不显示蒙版值

wol*_*evo 5 matplotlib

该图应仅显示屏蔽值.就像在右侧的(操纵)图中一样.

默认显示所有值.在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)

mga*_*gab 3

更新:Matplotlib >= 3.5.0

正如eric 的评论所指出的,问题已在 中解决matplotlib <= 3.5.0,并且 OP 中的代码按预期工作。所以现在,如果可以的话,最好的选择可能是更新 matplotlib。

对于更新 matplotlib 可能不可行的情况,原始答案留在这里。

旧:Matplotlib < 3.5.0

坏消息是,它似乎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

结果如下:

具有屏蔽值的 3d matplotlib 表面

  • 该问题现已在 Matplotlib 3.5.x 中修复 (2认同)