2011-12-07 14 views
98

Ho usato matplotlib per tracciare linee su una figura. Ora vorrei ora impostare lo stile, in particolare il marcatore, per i singoli punti sulla linea. Come faccio a fare questo?matplotlib: imposta marcatori per singoli punti su una riga

Modifica: per chiarire la mia domanda, a cui è stata data una risposta, voglio essere in grado di impostare lo stile per i singoli marcatori su una linea, non tutti gli indicatori su tale linea.

+2

soluzione adatta alla lunghezza di un arco spaziatura marcatore: http://stackoverflow.com/questions/17406758/plotting-a-curve-with-equidistant-arc-length-markers –

risposta

178

Specificare la parola chiave args linestyle e/o nella chiamata a plot.

Ad esempio, utilizzando una linea tratteggiata e pennarelli blu cerchio:

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

Una chiamata di scelta rapida per la stessa cosa:

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

example1

Ecco una lista dei possibili stili di linea e marcatori:

================ =============================== 
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: con un esempio la 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 utilizzando il markevery kwarg è possibile in dal 1.4+, a causa della fusione di this feature branch. Se si è bloccati su una versione precedente di matplotlib, è comunque possibile ottenere il risultato sovrapponendo un grafico a dispersione sul grafico a linee. Vedi lo edit history per maggiori dettagli.

+2

lo so quella parte. Quello che voglio fare è segnare solo determinati punti. Dato il tuo esempio, come metterei un marcatore solo sul 2 ° e 3 ° punto, ad esempio? Scusa se la mia domanda non è stata abbastanza chiara su questo aspetto. – dbmikus

+4

Puoi chiamare il plot una volta con lo stile '-', e poi puoi chiamare di nuovo il plot, su un sottoinsieme dei punti, con lo stile 'o'. – wim

+0

Dovrei semplicemente ripetere i valori che ho fornito per tracciare e creare una sottotrama di punti disconnessa con i marcatori? E poi sarebbero collocati in cima alla riga precedente? O c'è un modo più pulito per farlo? Sto bene in questo modo, ma mi piacerebbe codificarlo nel modo più accettabile. – dbmikus

11

Per riferimento futuro - l'artista Line2D restituito da plot() ha anche un metodo set_markevery() che permette di impostare solo i marcatori su alcuni 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: tipo step di sottoinsiemi penso .. – wim

+0

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

+1

@wim C'è un PR che si spera si trasformi in 1.4 che ti permetterà di segnare punti arbitrari https://github.com/matplotlib/matplotlib/pull/2662 – tacaswell

9

c'è uno spettacolo immagine nome e una descrizione tutti i marcatori, spero ti aiuterà.

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 Click here to see picture

Problemi correlati