Trazar una lista de coordenadas (x, y) en python matplotlib

110

Tengo una lista de pares con los (a, b)que me gustaría trazar matplotliben Python como coordenadas xy reales. Actualmente, está haciendo dos gráficos, donde el índice de la lista da la coordenada x, y los valores de y del primer gráfico son los as en los pares y los valores de y del segundo gráfico son los bs en los pares.

Para aclarar, mis datos se ven así: li = [(a,b), (c,d), ... , (t, u)] quiero hacer una sola línea que simplemente llame plt.plot()incorrectamente. Si no necesitara un one-liner, podría hacer trivialmente:

xs = [x[0] for x in li]
ys = [x[1] for x in li]
plt.plot(xs, ys)

¿Cómo puedo hacer que matplotlib represente estos pares como coordenadas xy?

CodeKingPlusPlus
fuente

Respuestas:

180

Según este ejemplo :

import numpy as np
import matplotlib.pyplot as plt

N = 50
x = np.random.rand(N)
y = np.random.rand(N)

plt.scatter(x, y)
plt.show()

Producirá:

ingrese la descripción de la imagen aquí

Para descomprimir sus datos de pares en listas, use zip:

x, y = zip(*li)

Entonces, el resumen:

plt.scatter(*zip(*li))
sashkello
fuente
7
Para una matriz numpy de 2 columnas, plt.scatter( * xy.T )funciona: corto y oscuro parax, y = xy.T; plt.scatter( x, y )
denis
2
x, y = zip(*li)¡Es un código Python realmente elegante! He estado haciendo las dos líneas de código más sencillas con una compresión de lista en cada línea (como la pregunta original)
Trevor Boyd Smith
1
Es un poco confuso qué plt.scattertiene que ver el ejemplo aleatorio con la pregunta.
jamesdlin
36

Si tiene una matriz numpy, puede hacer esto:

import numpy as np
from matplotlib import pyplot as plt

data = np.array([
    [1, 2],
    [2, 3],
    [3, 6],
])
x, y = data.T
plt.scatter(x,y)
plt.show()
Zweedeend
fuente
1
Así que no hay manera de tener una np.arrayde data=np.array([[x1,y1],[x2,y2],etc.])y el uso plt.plot(data). ¿Siempre tendré que dar dos matrices en lugar de matrices de matrices?
Max Coplan
1
@MaxCoplan, eso es correcto, pero podría usar el plt.plot(*data.T)que hace lo mismo que el anterior pero omite el paso intermedio.
Zweedeend
7

Si desea trazar una sola línea que conecte todos los puntos de la lista

plt . plot ( li [ : ] )

plt . show ( )

Esto trazará una línea que conectará todos los pares de la lista como puntos en un plano cartesiano desde el inicio de la lista hasta el final. Espero que esto sea lo que querías.

Shubham Rana
fuente
3
No quería trazar una sola línea, quería trazar con una "línea única" (una sola línea de código). La respuesta que estaba buscando (y obtuvo hace 3 años) fue usar scatter().
Dartmouth
8
Dado que esta respuesta establece la condición bajo la cual funciona, es decir, "Si desea trazar una sola línea que conecte todos los puntos de la lista", ¿realmente merece un voto negativo?
Gathide