2014-04-17 1 views
6

posso tracciare le barre di errore su barplots serie singoli in questo modo:Tracciare barre di errore sul barplots con più serie in panda

import pandas as pd 
df = pd.DataFrame([[4,6,1,3], [5,7,5,2]], columns = ['mean1', 'mean2', 'std1', 'std2'], index=['A', 'B']) 
print(df) 
    mean1 mean2 std1 std2 
A  4  6  1  3 
B  5  7  5  2 

df['mean1'].plot(kind='bar', yerr=df['std1'], alpha = 0.5,error_kw=dict(ecolor='k')) 

enter image description here

Come previsto, la media dell'indice di A è accoppiato con lo standard deviazione dello stesso indice, e la barra di errore mostra il +/- di questo valore.

Tuttavia, quando provo a tracciare sia 'mean1' e 'mean2' nella trama stessa non posso usare le deviazioni standard nello stesso modo:

df[['mean1', 'mean2']].plot(kind='bar', yerr=df[['std1', 'std2']], alpha = 0.5,error_kw=dict(ecolor='k')) 

    Traceback (most recent call last): 

    File "<ipython-input-587-23614d88a3c5>", line 1, in <module> 
    df[['mean1', 'mean2']].plot(kind='bar', yerr=df[['std1', 'std2']], alpha = 0.5,error_kw=dict(ecolor='k')) 

    File "C:\Users\name\Dropbox\Tools\WinPython-64bit-2.7.6.2\python-2.7.6.amd64\lib\site-packages\pandas\tools\plotting.py", line 1705, in plot_frame 
    plot_obj.generate() 

    File "C:\Users\name\Dropbox\Tools\WinPython-64bit-2.7.6.2\python-2.7.6.amd64\lib\site-packages\pandas\tools\plotting.py", line 878, in generate 
    self._make_plot() 

    File "C:\Users\name\Dropbox\Tools\WinPython-64bit-2.7.6.2\python-2.7.6.amd64\lib\site-packages\pandas\tools\plotting.py", line 1534, in _make_plot 
    start=start, label=label, **kwds) 

    File "C:\Users\name\Dropbox\Tools\WinPython-64bit-2.7.6.2\python-2.7.6.amd64\lib\site-packages\pandas\tools\plotting.py", line 1481, in f 
    return ax.bar(x, y, w, bottom=start,log=self.log, **kwds) 

    File "C:\Users\nameDropbox\Tools\WinPython-64bit-2.7.6.2\python-2.7.6.amd64\lib\site-packages\matplotlib\axes.py", line 5075, in bar 
    fmt=None, **error_kw) 

    File "C:\Users\name\Dropbox\Tools\WinPython-64bit-2.7.6.2\python-2.7.6.amd64\lib\site-packages\matplotlib\axes.py", line 5749, in errorbar 
    iterable(yerr[0]) and iterable(yerr[1])): 

    File "C:\Users\name\Dropbox\Tools\WinPython-64bit-2.7.6.2\python-2.7.6.amd64\lib\site-packages\pandas\core\frame.py", line 1635, in __getitem__ 
    return self._getitem_column(key) 

    File "C:\Users\name\Dropbox\Tools\WinPython-64bit-2.7.6.2\python-2.7.6.amd64\lib\site-packages\pandas\core\frame.py", line 1642, in _getitem_column 
    return self._get_item_cache(key) 

    File "C:\Users\name\Dropbox\Tools\WinPython-64bit-2.7.6.2\python-2.7.6.amd64\lib\site-packages\pandas\core\generic.py", line 983, in _get_item_cache 
    values = self._data.get(item) 

    File "C:\Users\name\Dropbox\Tools\WinPython-64bit-2.7.6.2\python-2.7.6.amd64\lib\site-packages\pandas\core\internals.py", line 2754, in get 
    _, block = self._find_block(item) 

    File "C:\Users\name\Dropbox\Tools\WinPython-64bit-2.7.6.2\python-2.7.6.amd64\lib\site-packages\pandas\core\internals.py", line 3065, in _find_block 
    self._check_have(item) 

    File "C:\Users\name\Dropbox\Tools\WinPython-64bit-2.7.6.2\python-2.7.6.amd64\lib\site-packages\pandas\core\internals.py", line 3072, in _check_have 
    raise KeyError('no item named %s' % com.pprint_thing(item)) 

KeyError: u'no item named 0' 

Il più vicino che hanno ottenuto alla mia uscita desiderata è questo:

df[['mean1', 'mean2']].plot(kind='bar', yerr=df[['std1', 'std2']].values.T, alpha = 0.5,error_kw=dict(ecolor='k')) 

enter image description here

Ma ora le barre di errore non sono tracciati in modo simmetrico. Invece le barre verdi e sfocate in ogni serie usano lo stesso errore positivo e negativo e questo è il punto in cui sono bloccato. Come posso ottenere le barre di errore del mio barattolo multiserie per avere un aspetto simile a quando avevo una sola serie?

Aggiornamento: Sembra che questo è stato risolto in pandas 0.14, stavo leggendo la documentazione per 0,13 in precedenza. Però non ho la possibilità di aggiornare i miei panda adesso. Farà più tardi e vedere come si scopre.

+0

lo capisci mai? – pocketfullofcheese

+0

Ancora non l'ho ancora provato in 0.14. Ho finito per usare matplotlib direttamente per questo caso specifico. –

risposta

6

Roger che Ajean e Alios!

Bene, ho finalmente trovato la risposta alla domanda. Questo è qualcosa che ho cercato di fare da giorni. Il problema apparentemente era un problema in una versione precedente di Pandas. Ho installato Pandas 0.15.0 e ora puoi fare riferimento a un altro frame di dati e utilizzare i dati per le barre di errore sui grafici a barre raggruppati come Ceflo stava cercando di fare sopra. Quindi il seguente codice ora funziona in Pandas 0.15.0.

import pandas as pd 
import matplotlib.pyplot as plt 
df = pd.DataFrame([[4,6,1,3], [5,7,5,2]], columns = ['mean1', 'mean2', 'std1', 'std2'], index=['A', 'B']) 
print(df) 

df[['mean1', 'mean2']].plot(kind='bar', yerr=df[['std1', 'std2']].values.T, alpha = 0.5,error_kw=dict(ecolor='k')) 
plt.show() 
+1

Buono a sapersi questo funziona. Nell'aggiornamento nella mia domanda ho notato che questo sembrava essere stato risolto da panda 0.14 in poi. Ma non avevo la possibilità di aggiornare i miei panda allora e dopo mi sono dimenticato di questo =) –