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

时间:2014-07-04 15:15:58

标签: matplotlib

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

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

1 个答案:

答案 0 :(得分:2)

坏消息是plot_surface()似乎忽略了面具。实际上有an open issue about it

然而,here他们指出了一种解决方法,虽然它远非完美,但可能会让您获得一些可接受的结果。关键问题是不会绘制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()

*我必须在rstride=1电话中添加plot_surface参数;否则我得到一个分段错误... o_O

这是结果:

3d matplotlib surface with masked values