300 votes

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

J'ai utilisé Matplotlib pour tracer des lignes sur une figure. Maintenant, 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 être capable de définir le style pour des marqueurs individuels sur une ligne, pas pour tous les marqueurs de ladite ligne.

2 votes

Solution connexe pour l'espacement des marqueurs de longueur d'arc : stackoverflow.com/questions/17406758/…

546voto

wim Points 35274

Spécifiez les args de mots-clés linestyle et/ou marker dans votre appel à plot.

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

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

Un appel raccourci pour la même chose :

plt.plot(range(10), '--bo', label='line with marker')
plt.legend()

entrer la description de l'image ici

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

================    ===============================
caractère           description
================    ===============================
   -                style de ligne solide
   --               style de ligne en pointillés
   -.               style de ligne en tiret-point
   :                style de ligne en pointillés
   .                marqueur de point
   ,                marqueur de pixel
   o                marqueur de cercle
   v                marqueur triangle bas
   ^                marqueur triangle haut
   <                marqueur triangle gauche
   >                marqueur triangle droit
   1                marqueur tri bas
   2                marqueur tri haut
   3                marqueur tri gauche
   4                marqueur tri droit
   s                marqueur carré
   p                marqueur pentagone
   *                marqueur étoile
   h                marqueur hexagone 1
   H                marqueur hexagone 2
   +                marqueur plus
   x                marqueur x
   D                marqueur diamant
   d                marqueur diamant fin
   |                marqueur vline
   _                marqueur hline
================    ===============================

éditer : 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, label='line with select markers')
plt.legend()
plt.show()

entrer la description de l'image ici

Cet exemple final utilisant l'argument de mot-clé markevery est possible depuis la version 1.4+, en raison de la fusion de cette branche de fonctionnalités. Si vous êtes coincé sur une version plus ancienne de matplotlib, vous pouvez toujours obtenir le résultat en superposant un graphique de dispersion sur le graphique de ligne. Consultez l'historique des modifications pour plus de détails.

0 votes

Si nous avions une itération sur markers_on Comment modifiez-vous la solution? Je veux dire si dans chaque cycle d'une boucle for nous avions des markers_on différents, comment résoudre le problème? Est-il juste une question d'écrire une boucle for pour cela?

90voto

Wubin Ding Points 562

Il y a une photo 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', 'cercle', 'triangle_en_bas', 'triangle_en_haut','triangle_gauche',
                'triangle_droite', 'tri_bas', 'tri_haut', 'tri_gauche', 'tri_droite', 'octogone',
                'carré', 'pentagone', 'plus (rempli)','étoile', 'hexagone1', 'hexagone2', 'plus',
                'x', 'x (rempli)','losange', 'losange_mince', 'ligne_verticale', 'ligne_horizontale']
x=[]
y=[]

for i in range(5):
    for j in range(5):
        x.append(i)
        y.append(j)

plt.figure(figsize=(8, 8))

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.axis('off')
plt.tight_layout()
plt.show() 

entrez la description de l'image ici

16voto

lost Points 223

Pour référence future - l'artiste Line2D retourné par plot() a également une méthode set_markevery() 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

12voto

Pankaj Joshi Points 51

Un petit truc pour changer la forme et la taille d'un marqueur particulier est de le tracer d'abord avec toutes les autres données puis de tracer un autre graphique uniquement avec ce marqueur (ou ensemble de marqueurs si vous souhaitez changer le style de plusieurs marqueurs). 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 : Graphique avec plusieurs marqueurs

description de l'image

4voto

Ricardo Roa Points 65

Bonjour Il y a un exemple:

import numpy as np
import matplotlib.pyplot as plt

def grafica_seno_coseno():
    x = np.arange(-4,2*np.pi, 0.3)
    y = 2*np.sin(x)
    y2 = 3*np.cos(x)
    plt.plot(x, y,  '-gD')
    plt.plot(x, y2, '-rD')
    for xitem,yitem in np.nditer([x,y]):
        etiqueta = "{:.1f}".format(xitem)
        plt.annotate(etiqueta, (xitem,yitem), textcoords="offset points",xytext=(0,10),ha="center")
    for xitem,y2item in np.nditer([x,y2]):
        etiqueta2 = "{:.1f}".format(xitem)
        plt.annotate(etiqueta2, (xitem,y2item), textcoords="offset points",xytext=(0,10),ha="center")
    plt.grid(True)
    plt.show()

grafica_seno_coseno()

entrez la description de l'image ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X