Traçando uma lista de coordenadas (x, y) em matplotlib python

109

Eu tenho uma lista de pares (a, b)que gostaria de representar matplotlibem python como coordenadas xy reais. Atualmente, ele está fazendo dois gráficos, onde o índice da lista fornece a coordenada x, e os valores y do primeiro gráfico são os as nos pares e os valores y do segundo gráfico são os bs nos pares.

Para esclarecer, meus dados se parecem com isto: li = [(a,b), (c,d), ... , (t, u)] Eu quero fazer um one-liner que apenas chama plt.plot()incorreto. Se eu não exigisse uma linha, poderia fazer trivialmente:

xs = [x[0] for x in li]
ys = [x[1] for x in li]
plt.plot(xs, ys)
  • Como posso fazer com que matplotlib plote esses pares como coordenadas xy?

Obrigado por toda a ajuda!

CodeKingPlusPlus
fonte

Respostas:

180

De acordo com este exemplo :

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

vai produzir:

insira a descrição da imagem aqui

Para descompactar seus dados de pares em listas, use zip:

x, y = zip(*li)

Então, o one-liner:

plt.scatter(*zip(*li))
Sashkello
fonte
7
Para uma matriz numpy de 2 colunas, plt.scatter( * xy.T )funciona: curto e obscuro parax, y = xy.T; plt.scatter( x, y )
denis
2
x, y = zip(*li)é um código python realmente elegante! Tenho feito as duas linhas de código mais diretas com uma compactação de lista em cada linha (como a pergunta original)
Trevor Boyd Smith
1
É meio confuso o que o plt.scatterexemplo aleatório tem a ver com a pergunta.
Jamesdlin
36

Se você tem uma matriz numpy, pode fazer isso:

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
fonte
1
Portanto, não há como ter um np.arrayde data=np.array([[x1,y1],[x2,y2],etc.])e usar plt.plot(data). Sempre terei que dar dois arrays em vez de arrays de arrays?
Max Coplan
1
@MaxCoplan, isso mesmo, mas você poderia usar o plt.plot(*data.T)que faz o mesmo que o anterior, mas pula a etapa intermediária.
Zweedeend
6

Se você deseja traçar uma única linha conectando todos os pontos da lista

plt . plot ( li [ : ] )

plt . show ( )

Isso traçará uma linha conectando todos os pares na lista como pontos em um plano cartesiano do início ao fim da lista. Espero que seja isso que você queria.

Shubham Rana
fonte
3
Ele não queria plotar uma única linha, ele queria plotar com um "one-liner" (uma única linha de código). A resposta que ele procurava (e obteve há 3 anos) era usar scatter().
Dartmouth
7
Visto que esta resposta indica a condição sob a qual funciona, ou seja, "Se você deseja traçar uma única linha conectando todos os pontos da lista", ela realmente merece uma votação negativa?
Gathide,