如何制作一个不显示掩码值的3D Matplotlib图表

6

图表应只显示掩码值,如右侧(经过处理的)图所示。

默认情况下会显示所有值。在2D图表中没有问题。

在3D图表中是否也可能呢?如果是,如何实现?

enter image description here

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()

答案是否达成了你想要的目标?它是否适用于你的情况?(也许时间有点久远了 :-S) - mgab
1个回答

3

更新:Matplotlib >= 3.5.0

正如eric的评论所指出的那样,这个问题在matplotlib <= 3.5.0版本中已经得到解决,原始代码可以正常工作。因此,如果您可以,更新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()

我必须在plot_surface调用中添加rstride=1参数,否则我会得到一个分段错误... o_O
以下是结果: 3d matplotlib surface with masked values

2
问题现在已经在Matplotlib 3.5.x中得到修复。 - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接