web-dev-qa-db-fra.com

dessiner des points en utilisant matplotlib.pyplot [[x1, y1], [x2, y2]]

Je veux dessiner un graphique en utilisant une liste de (x,y) paires au lieu d'utiliser deux listes, l'une des X et l'autre des Y. Quelque chose comme ça:

a = [[1,2],[3,3],[4,4],[5,2]]
plt.plot(a, 'ro')

Plutôt que:

plt.plot([1,3,4,5], [2,3,4,2])

Suggestions?

37
ariel

Vous pouvez faire quelque chose comme ça:

a=[[1,2],[3,3],[4,4],[5,2]]
plt.plot(*Zip(*a))

Malheureusement, vous ne pouvez plus passer "ro". Vous devez transmettre des valeurs de style de marqueur et de ligne comme paramètres de mot-clé:

a=[[1,2],[3,3],[4,4],[5,2]]
plt.plot(*Zip(*a), marker='o', color='r', ls='')

L'astuce que j'ai utilisée est déballage des listes d'arguments .

57
Christian Alis

Si vous utilisez un tableau numpy, vous pouvez extraire par axe:

a = array([[1,2],[3,3],[4,4],[5,2]])
plot(a[:,0], a[:,1], 'ro')

Pour les listes ou les listes, vous aurez besoin d'un assistant, comme:

a = [[1,2],[3,3],[4,4],[5,2]]
plot(*sum(a, []), marker='o', color='r')
10
pprzemek

liste des compréhensions

Je suggère fortement l'application libérale des compréhensions de liste. Non seulement ils sont concis et puissants, ils ont tendance à rendre votre code très lisible.

Essayez quelque chose comme ceci:

list_of_lists = [[1,2],[3,3],[4,4],[5,2]]    
x_list = [x for [x, y] in list_of_lists]
y_list = [y for [x, y] in list_of_lists]

plt.plot(x_list, y_list)

Le déballage des arguments doit être évité. C'est moche.

9
Moradology

Écrivez une fonction d'aide.

Voici une version longue, mais je suis sûr qu'il y a une astuce pour la compresser.

>>> def helper(lst):
    lst1, lst2 = [], []
    for el in lst:
        lst1.append(el[0])
        lst2.append(el[1])
    return lst1, lst2

>>> 
>>> helper([[1,2],[3,4],[5,6]])
([1, 3, 5], [2, 4, 6])
>>> 

Ajoutez également cet assistant:

def myplot(func, lst, flag):
    return func(helper(lst), flag)

Et appelez-le ainsi:

myplot(plt.plot, [[1,2],[3,4],[5,6]], 'ro')

Vous pouvez également ajouter une fonction à un objet déjà instancié.

1
Hamish Grubijan