2010-05-15 8 views
5

Sto usando matplotlib in Python per tracciare una linea con errorbars come segue:decisionale non errorbars fermato nella matplotlib con Python

plt.errorbar(xvalues, up_densities, yerr=ctl_sds, fmt='-^', lw=1.2, markersize=markersize, 
     markeredgecolor=up_color, color=up_color, label="My label", clip_on=False) 
plt.xticks(xvalues) 

ho impostato le zecche sul asse x utilizzando "xticks". Tuttavia, le barre di errore dell'ultimo punto in xvalues ​​(cioè xvalues ​​[-1]) vengono ritagliate a destra, ovvero solo una metà della barra di errore appare. Questo è vero anche con l'opzione clip_on = False. Come posso risolvere questo problema, in modo che le barre di errore appaiano complete, anche se il loro lato destro è tecnicamente fuori dagli xvalues ​​[-1]?

grazie.

risposta

10

In matplotlib, la maggior parte del controllo dettagliato deve essere fatto attraverso gli artisti. Penso che questo dovrebbe fare quello che vuoi:

import matplotlib.pyplot as plt 
from random import uniform as r 

x = range(10) 
e = plt.errorbar(x, [r(2,10) for i in x], [r(.1,1) for i in x], capsize=8, color='r') 

for b in e[1]: 
    b.set_clip_on(False) 

plt.show() 

enter image description here

Il problema si stavano avendo è che la parola chiave clip_on era utilizzato per controllare i marcatori e non le barre di errore. Per controllare i caratteri erratici, plt.errorbar restituisce una tupla, in cui il secondo elemento è un elenco di caratteri errati. Quindi qui vado attraverso la lista e spengo il ritaglio per ogni errore.

+0

Molto bello. In realtà ho provato la stessa identica cosa, ma non ho visto nulla perché non stavo ridisegnando correttamente. –

+3

Si noti che questo funziona solo per i tappi. Se la barra viene tagliata a metà (come vedrai quando spegni gli assi), devi fare lo stesso anche per tutti i b in e [2]. – Peter

+0

@Peter: buon punto. Grazie. – tom10

1

È questo che intendi? Vuoi ridefinire i limiti orizzontali della trama?

plt.errorbar(range(5), [3,2,4,5,1], yerr=[0.1,0.2,0.3,0.4,0.5]) 
ax = plt.gca() 
ax.set_xlim([-0.5,4.5]) 

Matplotlib errorbar http://up.stevetjoa.com/errorbar.png

+0

No, voglio che l'ultimo segno di graduazione sia 4 (nel tuo esempio) e l'asse orizzontale x per terminare con quello, senza che sia passato. Le linee orizzontali all'estremità delle barre di errore si estenderanno leggermente oltre la fine dell'asse x ma clip_on = False dovrebbe renderle comunque visibili ... anche se non lo fanno. Qualche idea su come posso farlo? – user248237dfsf