Définir des marqueurs pour des points individuels sur une ligne dans Matplotlib

174

J'ai utilisé Matplotlib pour tracer des lignes sur une figure. Je voudrais maintenant définir le style, en particulier le marqueur, pour des points individuels sur la ligne. Comment puis-je faire cela?

Pour clarifier ma question, je veux pouvoir définir le style des marqueurs individuels sur une ligne, pas tous les marqueurs sur ladite ligne.

dbmikus
la source
2
Solution associée pour l'espacement des marqueurs de longueur d'arc: stackoverflow.com/questions/17406758/…
Ioannis Filippidis

Réponses:

324

Spécifiez le mot-clé args linestyleet / ou markerdans votre appel à plot.

Par exemple, en utilisant une ligne en pointillés et des marqueurs de cercle bleu:

plt.plot(range(10), linestyle='--', marker='o', color='b')

Un appel de raccourci pour la même chose:

plt.plot(range(10), '--bo')

Exemple 1

Voici une liste des styles de lignes et de marqueurs possibles:

================    ===============================
character           description
================    ===============================
   -                solid line style
   --               dashed line style
   -.               dash-dot line style
   :                dotted line style
   .                point marker
   ,                pixel marker
   o                circle marker
   v                triangle_down marker
   ^                triangle_up marker
   <                triangle_left marker
   >                triangle_right marker
   1                tri_down marker
   2                tri_up marker
   3                tri_left marker
   4                tri_right marker
   s                square marker
   p                pentagon marker
   *                star marker
   h                hexagon1 marker
   H                hexagon2 marker
   +                plus marker
   x                x marker
   D                diamond marker
   d                thin_diamond marker
   |                vline marker
   _                hline marker
================    ===============================

edit: avec un exemple de marquage d'un sous-ensemble arbitraire de points, comme demandé dans les commentaires:

import numpy as np
import matplotlib.pyplot as plt

xs = np.linspace(-np.pi, np.pi, 30)
ys = np.sin(xs)
markers_on = [12, 17, 18, 19]
plt.plot(xs, ys, '-gD', markevery=markers_on)
plt.show()

exemple2

Ce dernier exemple utilisant le markeverykwarg est possible depuis la version 1.4+, en raison de la fusion de cette branche de fonctionnalité . Si vous êtes bloqué sur une ancienne version de matplotlib, vous pouvez toujours obtenir le résultat en superposant un nuage de points sur le graphique linéaire. Consultez l' historique des modifications pour plus de détails.

wim
la source
2
Je connais cette partie. Ce que je veux faire, c'est marquer seulement certains points. Compte tenu de votre exemple, comment pourrais-je mettre un marqueur uniquement sur les 2e et 3e points, par exemple? Désolé si ma question n'était pas assez claire sur cet aspect.
dbmikus
4
Vous pouvez appeler plot une fois avec le style «-», puis vous pouvez à nouveau appeler plot, sur un sous-ensemble de points, avec le style «o».
wim
Est-ce que je ferais simplement une itération sur les valeurs que j'ai fournies pour tracer et créerais simplement un sous-tracé de points déconnecté avec des marqueurs? Et puis ils seraient placés au-dessus de la ligne précédente? Ou y a-t-il un moyen plus propre de le faire? Je vais bien le faire de cette façon, mais j'aimerais le coder de la manière la plus acceptable.
dbmikus
1
Non, n'utilisez pas de boucle, il y aura trop d'artistes sur la toile, ce qui peut être très lent. Utilisez une tranche de l'entrée d'origine.
wim
@AbidRahmanK Vous pouvez également afficher tous les marqueurs disponibles via matplotlib.markers.MarkerStyle.markers, qui renvoie un dictionnaire similaire à ce que wim a publié ci-dessus.
joelostblom
54

Il y a une image montrant le nom et la description de tous les marqueurs, j'espère que cela vous aidera.

import matplotlib.pylab as plt
markers=['.',',','o','v','^','<','>','1','2','3','4','8','s','p','P','*','h','H','+','x','X','D','d','|','_']
descriptions=['point', 'pixel', 'circle', 'triangle_down', 'triangle_up','triangle_left', 'triangle_right', 'tri_down', 'tri_up', 'tri_left','tri_right', 'octagon', 'square', 'pentagon', 'plus (filled)','star', 'hexagon1', 'hexagon2', 'plus', 'x', 'x (filled)','diamond', 'thin_diamond', 'vline', 'hline']
x=[]
y=[]
for i in range(5):
    for j in range(5):
        x.append(i)
        y.append(j)
plt.figure()
for i,j,m,l in zip(x,y,markers,descriptions):
    plt.scatter(i,j,marker=m)
    plt.text(i-0.15,j+0.15,s=m+' : '+l)
plt.axis([-0.1,4.8,-0.1,4.5])
plt.tight_layout()
plt.axis('off')
plt.show()  

Exemple 1

Wubin Ding
la source
14

Pour référence future - l' Line2Dartiste renvoyé par a plot()également une set_markevery()méthode qui vous permet de définir des marqueurs uniquement sur certains points - voir https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D. set_markevery

perdu
la source
2
C'est vrai, mais pas sur des points arbitraires - il doit être start: stop: step sorte de sous-ensembles je pense ..
wim
J'ai l'impression que les deux articles ci-dessus répondent à la question. La raison en est qu'ils abordent deux problèmes différents. Le terme «marqueurs» fait généralement référence au style d'une courbe. Donc, une règle régulière (par exemple tous les 10) est implicite. Si vous désirez isoler un sous-ensemble "arbitraire" de points, veuillez considérer cela comme une courbe distincte et non comme des marqueurs sur la courbe d'origine. C'est juste une courbe différente qui a des marqueurs. On s'attend donc à ce que vous deviez sélectionner manuellement les points. Ce sujet est intéressant et va plus loin, commentera plus dans un prochain post, après la publication du code pertinent.
Ioannis Filippidis
1
@wim Il y a un PR qui, espérons-le, le transformera en 1.4 qui vous permettra de marquer des points arbitraires github.com/matplotlib/matplotlib/pull/2662
tacaswell
1

Une astuce simple pour changer la forme, la taille d'un marqueur de point particulier ... consiste d'abord à le tracer avec toutes les autres données, puis à tracer un autre tracé uniquement avec ce point (ou ensemble de points si vous souhaitez changer le style de plusieurs points) . Supposons que nous voulions changer la forme du marqueur du deuxième point:

x = [1,2,3,4,5]
y = [2,1,3,6,7]

plt.plot(x, y, "-o")
x0 = [2]
y0 = [1]
plt.plot(x0, y0, "s")

plt.show()

Le résultat est: Tracer avec plusieurs marqueurs

Pankaj Joshi
la source