Matplotlib de Python ttwigndo en orden incorrecto

Básicamente tengo dos matrices, una que contiene los valores del eje x y la segunda que contiene los valores del eje y. El problema es, cuando lo hago.

plt.semilogy(out_samp,error_mc) 

entiendo esto

introduzca la descripción de la imagen aquí

Lo que no tiene ningún sentido. Esto se debe a que las funciones de trazado trazan todo lo que encuentra en la matriz x, sin importar si está ordenado en orden ascendente o no. ¿Cómo puedo ordenar estas dos matrices para que la matriz x se ordene al boost el valor y el eje y se ordene de la misma manera para que los puntos sean iguales pero la gráfica esté conectada para que no haga este desorden?

¡Gracias de antemano!

Related of "Matplotlib de Python ttwigndo en orden incorrecto"

Ordenar por el valor del eje x antes de trazar. Aquí hay un MWE.

 import itertools x = [3, 5, 6, 1, 2] y = [6, 7, 8, 9, 10] lists = sorted(itertools.izip(*[x, y])) new_x, new_y = list(itertools.izip(*lists)) # import operator # new_x = map(operator.itemgetter(0), lists) # [1, 2, 3, 5, 6] # new_y = map(operator.itemgetter(1), lists) # [9, 10, 6, 7, 8] # Plot import matplotlib.pylab as plt plt.plot(new_x, new_y) plt.show() 

Para datos pequeños, zip (como lo mencionaron otros respondedores) es suficiente.

 new_x, new_y = zip(*sorted(zip(x, y))) 

El resultado,

introduzca la descripción de la imagen aquí

Es más fácil zip , ordenar y zip las dos listas de datos.

Ejemplo:

 xs = [...] ys = [...] xs, ys = zip(*sorted(zip(xs, ys))) plot(xs, ys) 

Consulte la documentación en formato zip aquí: https://docs.python.org/3.5/library/functions.html#zip

Una alternativa para ordenar las listas sería usar matrices NumPy y usar np.sort() para ordenar. La ventaja de usar matrices sería una operación vectorizada mientras se calcula una función como y = f (x). A continuación se muestra un ejemplo de trazado de una distribución normal:

Sin utilizar datos ordenados.

 mu, sigma = 0, 0.1 x = np.random.normal(mu, sigma, 200) f = 1/(sigma * np.sqrt(2 * np.pi)) *np.exp( - (x - mu)**2 / (2 * sigma**2) ) plt.plot(x,f, '-bo', ms = 2) 

Salida 1

introduzca la descripción de la imagen aquí

Con el uso de np.sort () Esto permite usar directamente la matriz ordenada x mientras se calcula la distribución normal.

 mu, sigma = 0, 0.1 x = np.sort(np.random.normal(mu, sigma, 200)) # or use x = np.random.normal(mu, sigma, 200).sort() f = 1/(sigma * np.sqrt(2 * np.pi)) *np.exp( - (x - mu)**2 / (2 * sigma**2) ) plt.plot(x,f, '-bo', ms = 2) 

Alternativamente, si ya tiene datos x e y sin clasificar, puede usar numpy.argsort para clasificarlos a posteriori

 mu, sigma = 0, 0.1 x = np.random.normal(mu, sigma, 200) f = 1/(sigma * np.sqrt(2 * np.pi)) *np.exp( - (x - mu)**2 / (2 * sigma**2) ) plt.plot(np.sort(x), f[np.argsort(x)], '-bo', ms = 2) 

En ambos casos la salida es

Salida 2

introduzca la descripción de la imagen aquí

solo haz esto

 list=zip(*sorted(zip(*(x,y)))) plt.plot(*list) 

La función ordenada se ordenará de acuerdo con el primer argumento, es decir, los valores de x

Creo que necesita ordenar una matriz y la otra matriz también debe ordenarse según la primera matriz. Obtuve esta solución de alguna otra pregunta de desbordamiento de stack. Probablemente esta debe ser tu solución.

 out_samp,error_mc=zip(*sorted(zip(out_samp,error_mc))) 

Ahora traza esos dos valores, obtienes un gráfico correcto.

Puede convertir sus arreglos en varios arreglos, luego usar argsort en el primer arreglo, tomar el arreglo y ordenar ambos arreglos con el arreglo argsort.