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

3 minutos de lectura

avatar de usuario
CódigoKingPlusPlus

tengo una lista de pares (a, b) que me gustaría tramar con matplotlib en python como coordenadas xy reales. Actualmente, está haciendo dos parcelas, donde el índice de la lista da la coordenada x, y los valores y de la primera parcela son los as en los pares y los valores de y de la segunda gráfica son los bs en las parejas.

Para aclarar, mis datos se ven así: li = [(a,b), (c,d), ... , (t, u)]
Quiero hacer una frase de una sola línea que solo llame plt.plot() incorrecto. Si no necesitara una sola línea, 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 trace estos pares como coordenadas xy?


Data de muestra

# sample data
li = list(zip(range(1, 14), range(14, 27)))

li → [(1, 14), (2, 15), (3, 16), (4, 17), (5, 18), (6, 19), (7, 20), (8, 21), (9, 22), (10, 23), (11, 24), (12, 25), (13, 26)]

Trama incorrecta

plt.plot(li)
plt.title('Incorrect Plot:\nEach index of the tuple plotted as separate lines')

ingrese la descripción de la imagen aquí

Parcela deseada

  • Esto produce la trama correcta, pero se utilizan muchas líneas de código para desempaquetar li. Necesito desempaquetar y trazar con una sola línea de código, no con múltiples listas de comprensión.
xs = [x[0] for x in li]
ys = [x[1] for x in li]
plt.plot(xs, ys)
plt.title('Correct Plot:\nBut uses to many lines to unpack li')

ingrese la descripción de la imagen aquí

  • Esencialmente, esta es una pregunta sobre cómo descomprimir una lista de tuplas, que se aborda con Desempaquetar una lista/tupla de pares en dos listas/tuplas. Sin embargo, esa respuesta no muestra cómo desempaquetar el zip objeto en la API de trazado.

    –Trenton McKinney

    26 de julio a las 20:54

avatar de usuario
sashkello

Dado li en la pregunta:

li = list(zip(range(1, 14), range(14, 27)))

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

x, y = zip(*li)

x → (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)
y → (14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26)

El one-liner utiliza el operador de desembalaje zippara descomprimir la lista de tuplas para zip y desempaqueta el

plt.scatter(*zip(*li))

objeto en la API de trazado.

plt.plot(*zip(*li))

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí
avatar de usuario

Zweedeend

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

  • Si tiene una matriz numpy, puede hacer esto: np.array Así que no hay manera de tener un data=np.array([[x1,y1],[x2,y2],etc.]) de plt.plot(data)y usando

    . ¿Siempre tendré que dar dos matrices en lugar de matrices de matrices?

    –Max Coplan


  • 3 de diciembre de 2018 a las 16:15 plt.plot(*data.T) @MaxCoplan, así es, pero podrías usar

    que hace lo mismo que el anterior pero se salta el paso intermedio.

    – Zweedeend

14 de noviembre de 2019 a las 7:37
avatar de usuario

Shubham Rana

plt.plot(li[:])

plt.show()

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

  • Esto trazará una línea que conecta todos los pares de la lista como puntos en un plano cartesiano desde el principio de la lista hasta el final. Espero que esto sea lo que querías. scatter()No quería trazar una sola línea, quería trazar con un “one-liner” (una sola línea de código). La respuesta que estaba buscando (y obtuvo hace 3 años) fue usar

    .

    – Dartmouth

  • 26 de febrero de 2017 a las 18:07 plt.plot(li) @Gathide: Sí, merece un voto negativo, ya que no funciona en absoluto y no se ajusta a la descripción. plt.plot(li[:])es como (y1, y2) . Simplemente traza 2 líneas, usando los pares como (x1, y1)y no como

    .

    –Eric Duminil

  • 12 abr 2021 a las 18:36 El comentario de @Dartmouth es solo medio correcto. El OP quiere generar una línea de trama, con una sola línea. Los estados OPSi no necesitara una sola línea, podría hacer trivialmente

    , seguido del código para producir una sola línea. Esta respuesta no resuelve la pregunta. Produce el mismo diagrama de línea doble no deseado que ya tiene el OP.

    –Trenton McKinney

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad