Tracer une liste de coordonnées (x, y) en python matplotlib

110

J'ai une liste de paires avec (a, b)lesquelles je voudrais tracer matplotliben python en tant que coordonnées xy réelles. Actuellement, il fait deux tracés, où l'index de la liste donne la coordonnée x, et les valeurs y du premier tracé sont les as dans les paires et les valeurs y du second tracé sont les bs dans les paires.

Pour clarifier, mes données ressemblent à ceci: li = [(a,b), (c,d), ... , (t, u)] je veux faire un one-liner qui appelle juste plt.plot()incorrect. Si je n'avais pas besoin d'un one-liner, je pourrais facilement faire:

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

Comment puis-je demander à matplotlib de tracer ces paires en coordonnées xy?

CodeKingPlusPlus
la source

Réponses:

180

Selon cet exemple :

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

produira:

entrez la description de l'image ici

Pour décompresser vos données de paires en listes, utilisez zip:

x, y = zip(*li)

Donc, le one-liner:

plt.scatter(*zip(*li))
sashkello
la source
7
Pour un tableau numpy à 2 colonnes, plt.scatter( * xy.T )fonctionne: court et obscur pourx, y = xy.T; plt.scatter( x, y )
denis
2
x, y = zip(*li)est un code python vraiment élégant! J'ai fait les deux lignes de code les plus simples avec une compression de liste sur chaque ligne (comme la question d'origine)
Trevor Boyd Smith
1
C'est un peu confus ce que l' plt.scatterexemple aléatoire a à voir avec la question.
jamesdlin
36

Si vous avez un tableau numpy, vous pouvez le faire:

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
la source
1
Donc , il n'y a pas moyen d'avoir un np.arrayde data=np.array([[x1,y1],[x2,y2],etc.])et utiliser plt.plot(data). Je vais toujours devoir donner deux tableaux au lieu de tableaux de tableaux?
Max Coplan
1
@MaxCoplan, c'est vrai, mais vous pouvez utiliser plt.plot(*data.T)ce qui fait la même chose que ci-dessus, mais ignore l'étape intermédiaire.
Zweedeend
7

Si vous souhaitez tracer une seule ligne reliant tous les points de la liste

plt . plot ( li [ : ] )

plt . show ( )

Cela tracera une ligne reliant toutes les paires de la liste sous forme de points sur un plan cartésien du début de la liste à la fin. J'espère que c'est ce que vous vouliez.

Shubham Rana
la source
3
Il ne voulait pas tracer une seule ligne, il voulait tracer avec un "one-liner" (une seule ligne de code). La réponse qu'il cherchait (et a obtenu il y a 3 ans) était d'utiliser scatter().
Dartmouth
8
Puisque cette réponse énonce la condition dans laquelle cela fonctionne, c'est-à-dire «Si vous voulez tracer une seule ligne reliant tous les points de la liste», mérite-t-elle vraiment un vote défavorable?
Gathide