2017-03-29 2 views
1

J'essaie de créer un tracé de surface 3D, mais j'ai de la difficulté à transformer mes données dans le bon format.Organiser des données pour créer un graphique de surface 3D

Remodeler ma variable Z me donne: 'ValueError: la taille totale du nouveau tableau doit être inchangée'. La forme de Z est (2500,50). Les formes pour X et Y sont les deux (50,50). Je ne sais pas pourquoi c'est ainsi. Est-ce qu'il y a quelque chose qui ne va pas dans mon code?

import numpy as np 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 


def Mountain(F, P): 
    TA = ((TAmax-TAmin) * (((FF**g)/((FF**g)+FFhm**g)**a)/((((FF**g)/((FF**g)+FFhm**g))**a)+(SP/SPe)**a))) 
    return TA 


F = np.linspace(0,120) 
P = np.linspace(0,100) 
Fb= int(21) 
Fro= int(362) 
FFhm = int(63) 
g= int(3) 
a = int(3) 
SPmin = float(1.82) 
SPbend = float(0.5) 
SPe = int(10) 
TAmax= int(1) 
TAmin = int(0) 

SP = SPmin + SPbend * np.log(1 + np.exp((P - SPmin)/SPbend)) 

FF= (Fb * (np.log(1 + np.exp(Fro/Fb)) - np.log(1 + np.exp((Fro-F)/Fb)))) 


fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
X, Y = np.meshgrid(F, P) 
gh= list(zip(np.ravel(X), np.ravel(Y))) 
zs = np.array(Mountain(F,P) for F,P in gh) 
Z = zs.reshape(X.shape) 

ax.plot_surface(X, Y, Z) 

ax.set_xlabel('F') 
ax.set_ylabel('P') 
ax.set_zlabel('TA') 

plt.show() 

Répondre

0

Vous devez mettre une valeur z pour chaque paire de (X, Y). Cela signifie que vous n'avez pas besoin de numpy.ravel. Les tailles de X, Y et Z doivent être les mêmes:

import numpy as np 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 


def Mountain(F, P): 
    TA = ((TAmax-TAmin) * (((FF**g)/((FF**g)+FFhm**g)**a)/((((FF**g)/((FF**g)+FFhm**g))**a)+(SP/SPe)**a))) 
    return TA 


F = np.linspace(0,120) 
P = np.linspace(0,100) 
Fb= int(21) 
Fro= int(362) 
FFhm = int(63) 
g= int(3) 
a = int(3) 
SPmin = float(1.82) 
SPbend = float(0.5) 
SPe = int(10) 
TAmax= int(1) 
TAmin = int(0) 

SP = SPmin + SPbend * np.log(1 + np.exp((P - SPmin)/SPbend)) 
FF= (Fb * (np.log(1 + np.exp(Fro/Fb)) - np.log(1 + np.exp((Fro-F)/Fb)))) 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
X, Y = np.meshgrid(F, P) 
Z = np.array(Mountain(F,P)) 

ax.plot_surface(X, Y, Z) 

ax.set_xlabel('F') 
ax.set_ylabel('P') 
ax.set_zlabel('TA') 

plt.show() 

enter image description here

0

Notez que ZS est vide. Si vous voulez faire la compréhension de la liste, vous devez utiliser des parenthèses (donc np.array([Mountain(F,P) for F,P in gh])), bien que ce que vous voulez vraiment, c'est zs = np.array([Mountain(X[i],Y[i]) for i in range(X.shape[0])]) au lieu de ravel.