matplotlib 3D 网格图
好的,我有一组x值、y值和z值(我想我已经把它们转换成数组了?),我想用这些数据画一个表面图,但现在不太成功。
我想做的事情是这样的,你可以忽略大部分代码,因为那些内容不太相关——只看最后的部分,我有xdis
、ydis
和dist
,在我尝试绘图的时候,出现了一个错误:ValueError: 需要更多的值来解包 :(。非常感谢你的帮助。
from math import *
from numpy import *
import pylab
def sweep (v,p,q,r,s):
a=.98
for i in range (1, len(v)-1):
for j in range (1, len(v)-1):
c =0.0
if i==p and j==q: c =1.0
if i==r and j==s: c= -1.0
v[i,j]=(v[i -1,j]+v[i+1,j]+v[i,j -1]+v[i,j+1]+c-a*v[i,j])/(4-a)
def main():
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
ydis=[]
xdis=[]
resis=[]
for j in range(2,18):
for i in range(2,18):
v= zeros ((20,20),float )
p=q=9
r=i
s=j
dv =1.0e10
lastdv =0
count =0
while (fabs(dv - lastdv)>1.0e-7*fabs(dv)):
lastdv =dv
sweep(v,p,q,r,s)
dv=v[p,q]-v[r,s]
resis.append(dv)
xdis.append(r-p)
ydis.append(s-q)
X=array(xdis)
Y=array(ydis)
Z=array(resis)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(X,Y,Z)
plt.show()
main()
2 个回答
0
看起来“sweep”这个函数并没有改变'v'的内容,所以你得到的是一个空列表。
3
plot_wireframe 这个函数需要三个二维数组(X、Y、Z)作为输入。所以,
在:
X=np.array(xdis)
Y=np.array(ydis)
Z=np.array(resis)
之后,添加:
X=X.reshape((-1,16))
Y=Y.reshape((-1,16))
Z=Z.reshape((-1,16))