【问题标题】:matplotlib 3D plot, plot_surface blackmatplotlib 3D 绘图,plot_surface 黑色
【发布时间】:2016-05-23 00:07:29
【问题描述】:

我有以下数据: https://www.dropbox.com/s/u7ee09chaixw5vb/draw?dl=0

在python3中使用pickle保存,只是一个二维的python列表,形式为z=[[],[],[]...[]]

我使用以下代码绘制 3D 图形,但它只显示黑色表面,为什么? xydict可以从上面的文件中加载:

    from mpl_toolkits.mplot3d import Axes3D

    fig = plt.figure()
    ax = Axes3D(fig)
    X = np.arange(0, len(xydict))
    Y = np.arange(0, len(xydict[0]))
    X, Y = np.meshgrid(X, Y)
    Z = np.array(xydict).T


    ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.cm.hot)     
    # ax.contourf(X, Y, Z, zdir='z', offset=0, cmap=plt.cm.hot)
    ax.set_zlim(0,1)

    plt.savefig('plot3d_ex.png', dpi=480)

【问题讨论】:

  • 如果只显示(而不是 savefig)会出现问题吗?另外,如果您尝试使用 imshow 绘制它,图片是否正确显示?您应该将您正在使用的 matplotlib 版本添加到您的问题中,它可能是相关的。
  • 是的,imshow 是正确的,当我用 plot_surface 做像 sin(x) 这样简单的函数时,也可以。

标签: python python-3.x numpy matplotlib


【解决方案1】:

您的数据和您使用的参数都存在一些问题。您的表面形状非常不均匀,您为每一行请求一个rstride。结果是你只能从大步中看到黑色。

另一个问题是您的数据中似乎有nan 值。如果您将数据限制为有效值并选择更好的stride 数字,您应该获得更好的图。比如这个:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import pickle

with open('draw', 'rb') as pickle_file:
    xydict = pickle.load(pickle_file)

fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(0, len(xydict))
Y = np.arange(0, len(xydict[0]))
X, Y = np.meshgrid(X, Y)
Z = np.array(xydict).T

ax.plot_surface(X[:,:-2], Y[:,:-2], Z[:,:-2], rstride=100, cstride=1, cmap=plt.cm.hot)     
# ax.contourf(X, Y, Z, zdir='z', offset=0, cmap=plt.cm.hot)
ax.set_zlim(0,1)
plt.show()

,结果如下:

【讨论】:

  • 非常感谢!你帮了我很多!
猜你喜欢
  • 2018-06-22
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
相关资源
最近更新 更多