Imposta i marker per i singoli punti su una linea in Matplotlib


174

Ho usato Matplotlib per tracciare linee su una figura. Ora vorrei impostare lo stile, in particolare l'indicatore, per i singoli punti sulla linea. Come faccio a fare questo?

Per chiarire la mia domanda, voglio essere in grado di impostare lo stile per i singoli marcatori su una linea, non tutti i marcatori su detta linea.


2
Soluzione adatta alla spaziatura marcatore lunghezza di un arco: stackoverflow.com/questions/17406758/...
Ioannis Filippidis

Risposte:


324

Specifica la parola chiave args linestylee / o markernella tua chiamata a plot.

Ad esempio, utilizzando una linea tratteggiata e marcatori di cerchio blu:

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

Una scorciatoia per la stessa cosa:

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

Esempio 1

Ecco un elenco dei possibili stili di linea e marker:

================    ===============================
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
================    ===============================

modifica: con un esempio di marcatura di un sottoinsieme arbitrario di punti, come richiesto nei commenti:

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

Quest'ultimo esempio usando markeverykwarg è possibile da 1.4+ in poi, grazie all'unione di questo ramo di funzionalità . Se sei bloccato su una versione precedente di matplotlib, puoi comunque ottenere il risultato sovrapponendo un grafico a dispersione sul grafico a linee. Vedi la cronologia delle modifiche per maggiori dettagli.


2
Conosco quella parte. Quello che voglio fare è contrassegnare solo alcuni punti. Dato il tuo esempio, come metterei un marcatore solo sul 2o e 3o punto, per esempio? Scusate se la mia domanda non era abbastanza chiara su questo aspetto.
dbmikus,

4
Puoi chiamare la trama una volta con lo stile '-', e quindi puoi chiamare di nuovo la trama, su un sottoinsieme dei punti, con lo stile 'o'.
mercoledì

Vorrei solo scorrere i valori che ho fornito per tracciare e creare semplicemente una sottotrama dot disconnessa con marcatori? E poi verrebbero messi in cima alla riga precedente? O c'è un modo più pulito per farlo? Sto bene così, ma vorrei codificarlo nel modo più accettabile.
dbmikus,

1
No, non usare un loop, ci saranno troppi artisti sulla tela che possono essere molto lenti. Usa una porzione dell'input originale.
mercoledì

@AbidRahmanK Puoi anche visualizzare tutti i marker disponibili tramite matplotlib.markers.MarkerStyle.markers, che restituisce un dizionario simile a quello pubblicato in precedenza.
joelostblom,

54

C'è una foto che mostra il nome e la descrizione di tutti gli indicatori, spero che ti possa aiutare.

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

Esempio 1


14

Per riferimento futuro - l' Line2Dartista restituito da plot()ha anche un set_markevery()metodo che ti consente di impostare i marker solo su determinati punti - vedi https://matplotlib.org/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D. set_markevery


2
Vero, ma non su punti arbitrari - deve essere start: stop: passo tipo di sottoinsiemi penso ..
wim

La mia impressione è che entrambi i post sopra rispondano alla domanda. Il motivo è che affrontano due diversi problemi. Il termine "marcatori" di solito si riferisce allo stile di una curva. Quindi è implicita una regola regolare (ad esempio ogni 10). Se desideri individuare un sottoinsieme "arbitrario" di punti, consideralo come una curva separata, non come marcatori sulla curva originale. È solo una curva diversa che sembra avere marcatori. Quindi è necessario selezionare manualmente i punti. Questo argomento è interessante e approfondisce, commenterà di più in un post futuro, dopo aver rilasciato il codice pertinente.
Ioannis Filippidis,

1
@wim Esiste un PR che si spera trasformerà in 1.4 che ti permetterà di segnare punti arbitrari github.com/matplotlib/matplotlib/pull/2662
tacaswell

1

Un semplice trucco per cambiare una particolare forma, dimensione del marker di punto ... consiste nel tracciarlo prima con tutti gli altri dati, quindi tracciare un altro diagramma solo con quel punto (o insieme di punti se si desidera cambiare lo stile di più punti) . Supponiamo di voler cambiare la forma del marker del secondo punto:

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

Il risultato è: Traccia con più marcatori

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.