He creado una función con dos argumentos, func(x,y)
. Ahora me gustaría trazar esto como un gráfico de contorno 2D, primero como func(x,y)
vs. x
, y entonces func(x,y)
vs. y
.
Configuré mi matriz numpy para valores de x como 20 valores de 5e4
a 8e4
, y los valores de y como 20 valores de 1e10
a 1e12
. Mi funcion func(x,y)
luego toma estas dos matrices como argumentos.
Así, configuro mi trama de la siguiente manera:
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab
matplotlib.rcParams["xtick.direction"] = "out"
matplotlib.rcParams["ytick.direction"] = "out"
x = np.logspace( 5e4, 8e4, num=20)
y = np.logspace(1e10, 1e12, num=20)
z = np.asarray([ func(x, y), x ])
plt.figure()
CS = plt.contour(x, y, z)
plt.clabel(CS, inline=1, fontsize=10)
Las formas para mis matrices numpy son:
print x.shape
print y.shape
print z.shape
que salidas
(20,)
(20,)
(2, 20)
Mi error es
TypeError: Length of y must be number of rows in z.
¿Por qué sería eso? Las dimensiones parecen correctas.
Respuestas
1 para la respuesta № 1De los documentos para contour
: "X y Y ambos deben ser 2-D con la misma forma que Z, o ambos deben ser 1-D, de modo que len (X) es el número de columnas en Z y len (Y) es el número de filas en Z."(Esta es la versión para 1D X e Y.)
Tu problema básico aquí es que Z
Necesita ser rectangular, así que probablemente 20x20 en tu caso. Es decir, piense en un diagrama de contorno como poner niveles en algo como una imagen.
Lo mejor que puedo entender, aquí está una versión de trabajo que está en la línea de lo que quieres:
import pylab as pb
import numpy as np
import matplotlib.pyplot as plt
def f(x, y):
return np.log(x**2 + y**2)
x = np.logspace( np.log10(5e4), np.log10(8e4), num=20)
y = np.logspace(np.log10(5e4), np.log10(9e4), num=20)
X, Y = np.meshgrid(x, y)
z = f(X, Y)
print x
print y
print min(z.flat), max(z.flat), min(x), max(x), min(y), max(y)
plt.figure()
CS = plt.contour(x, y, z)
plt.clabel(CS, inline=1, fontsize=10)
pb.show()
Creo que la clave que no estás usando. meshgrid
(aunque hay otros medios para conseguir esto también).