Using meshgrid to convert X,Y,Z triplet to three 2D arrays for surface plot in matplotlib

﹥>﹥吖頭↗ 提交于 2020-01-04 06:31:21

问题


I'm new to Python so please be patient. I appreciate any help!

What I have: three 1D lists (xr, yr, zr), one containing x-values, the other two y- and z-values
What I want to do: create a 3D contour plot in matplotlib

I realized that I need to convert the three 1D lists into three 2D lists, by using the meshgrid function.

Here's what I have so far:

xr = np.asarray(xr) 
yr = np.asarray(yr)
zr = np.asarray(zr)

X, Y = np.meshgrid(xr,yr)
znew = np.array([zr for x,y in zip(np.ravel(X), np.ravel(Y))])
Z = znew.reshape(X.shape)

Running this gives me the following error (for the last line I entered above):

 total size of new array must be unchanged

I went digging around stackoverflow, and tried using suggestions from people having similar problems. Here are the errors I get from each of those suggestions:

Changing the last line to:

Z = znew.reshape(X.shape[0])

Gives the same error.

Changing the last line to:

Z = znew.reshape(X.shape[0], len(znew))

Gives the error:

Shape of x does not match that of z: found (294, 294) instead of (294, 86436).

Changing it to:

Z = znew.reshape(X.shape, len(znew))

Gives the error:

an integer is required

Any ideas?


回答1:


Well,sample code below works for me

import numpy as np
import matplotlib.pyplot as plt

xr = np.linspace(-20, 20, 100)
yr = np.linspace(-25, 25, 110)
X, Y = np.meshgrid(xr, yr)

#Z = 4*X**2 + Y**2

zr = []
for i in range(0, 110):
    y = -25.0 + (50./110.)*float(i)
    for k in range(0, 100):
        x = -20.0 + (40./100.)*float(k)

        v = 4.0*x*x + y*y

        zr.append(v)

Z = np.reshape(zr, X.shape)

print(X.shape)
print(Y.shape)
print(Z.shape)

plt.contour(X, Y, Z)
plt.show()


来源:https://stackoverflow.com/questions/34126136/using-meshgrid-to-convert-x-y-z-triplet-to-three-2d-arrays-for-surface-plot-in-m

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!