web-dev-qa-db-fra.com

matplotlib: Définit 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?

Edit: pour clarifier ma question, à laquelle une réponse a été apportée, je souhaite pouvoir définir le style des marqueurs individuels sur une ligne, et non de tous les marqueurs de cette ligne.

136
dbmikus

Spécifiez le mot clé args linestyle et/ou marker dans votre appel à plot.

Par exemple, en utilisant une ligne pointillée 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')

example1

Voici une liste des styles de ligne et de marqueur 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
================    ===============================

éditez: 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()

example2

Ce dernier exemple utilisant la markevery kwarg est possible depuis 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 diagramme de dispersion sur le tracé. Voir le modifier l'historique pour plus de détails.

266
wim

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

example1

41
Wubin Ding

Pour référence future - l'artiste Line2D renvoyé par plot() dispose également d'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

14
lost