2014-11-07 14 views
6

Sto cercando di tracciare una serie con barre di errore asimmetriche utilizzando panda e matplotlib con il seguente codice:Perché i panda applicano gli stessi valori su entrambi i lati di una barra di errore asimmetrica?

d = {'high_delta': {1: 0.6, 
    2: 0.1, 
    3: 0.2, 
    4: 0.1, 
    5: 0.1, 
    6: 0.1, 
    7: 0.1, 
    8: 0.1, 
    9: 0.2, 
    10: 0.1}, 
'low_delta': {1: 0.2, 
    2: 0.1, 
    3: 0.1, 
    4: 0.1, 
    5: 0.1, 
    6: 0.1, 
    7: 0.1, 
    8: 0.1, 
    9: 0.1, 
    10: 0.4}, 
'p_hat': {1: 0.2, 
    2: 0.1, 
    3: 0.3, 
    4: 0.3, 
    5: 0.1, 
    6: 0.3, 
    7: 0.2, 
    8: 0.2, 
    9: 0.1, 
    10: 0.8}} 

df = pandas.DataFrame(d) 
df['p_hat'].plot(yerr=df[['low_delta', 'high_delta']].T.values) 
(df.p_hat + df.high_delta).plot(style='.') 
(df.p_hat - df.low_delta).plot(style='*') 

I limiti inferiori sembrano sempre di corrispondere a ciò che mi sarei aspettato, ma invece di aggiungere i valori sulla upper bound sembra aggiungere nuovamente i valori dal limite inferiore.

Come devono passare gli errori in matplotlib in modo che le barre di errore vengano visualizzate correttamente?

+0

Puoi riscriverlo senza usare i panda? – tacaswell

+0

Tutto funziona perfettamente se sostituisco 'df ['p_hat']. Plot()' con 'plt.errorbar (df.index.values, df ['p_hat']. Valori, yerr = df [['low_delta', ' high_delta ']]. T.values) ', ma mi piacerebbe farlo funzionare in panda o almeno sapere perché non lo fa. – 2daaa

+0

Vorrei inserire un bug report con i panda in quanto si tratta di un bug nei panda – tacaswell

risposta

5

Risposta breve: utilizzare liste di errori a forma di 1x2xN per barre di errore asimmetriche.

F.ex. nell'esempio corrente utilizzare

errors = [ f.index.values, df['p_hat'].values ] 
df['p_hat'].plot(yerr=[errors]) 

Attualmente v'è un errore nel Pandas che si traduce in panda per interpretare barre di errore fornite in forma 2xN per una serie allo stesso modo interpreterebbe più barre di errore per più righe di un DataFrame. Dato che ovviamente stai tracciando solo 1 riga/serie, solo il primo elemento della lista delle barre di errore viene utilizzato e interpretato come errori simmetrici.

Fino alla bug è fissato in panda può "ingannare" i panda in utilizzando errori asimmetrici bar passando errori in forma di Mx2xN come è la forma prevista per le barre di errore asimmetriche su DataFrames. Per essere precisi, è necessario utilizzare una lista a forma di 1x2xN, che può essere semplicemente creata chiamando f.ex. yerr=[ ... ]

Problemi correlati