简体   繁体   中英

matplotlib 3D plot, plot_surface black

I have the following data: https://www.dropbox.com/s/u7ee09chaixw5vb/draw?dl=0

it is saved using pickle in python3 and it is just a two dimensional python list, in the form of z=[[],[],[]...[]]

and I use the following code to plot the 3D graph, but it only shows me black surface, why? xydict can be loaded from the file above:

    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)

在此输入图像描述

There are a few problems with both your data and the arguments you used. The shape of your surface is extremely unequal and you are requesting one rstride for every line. The result is that you only see the black from the strides.

The other problem is that you seem to have nan values in your data. Should you limit the data to the valid values and pick better stride numbers you should obtain a far better plot. For instance this:

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

, results in this:

在matplotlib中绘制具有非常不相等形状的表面

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM