трехмерный каркасный график matplotlib

#python #3d #numpy #matplotlib

#python #3D #numpy #matplotlib

Вопрос:

Итак, у меня есть список значений x, значений y и значений z (которые, я думаю, я преобразовал в массивы?) я хочу создать график поверхности, но он не работает.

Вот что я пытаюсь сделать, вы можете игнорировать большую часть кода, поскольку это довольно неуместно — просто посмотрите в конец, где у меня есть xdis , ydis и dist и где я пытаюсь построить atm, я получаю ValueError: требуется более 1 значения для распаковки: (. Помощь с благодарностью.

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

Ответ №1:

plot_wireframe ожидает три 2D-массива (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))        
 

Ответ №2:

Не похоже, что функция «sweep» изменяет ‘v’, поэтому вы получаете пустой список.