2014-04-17 11 views
6

mogę wykreślić słupki błędów na barplots jednej serii tak:kreślenie słupki błędów na barplots z wielu serii w pand

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

Zgodnie z oczekiwaniami, średnia indeksu A jest sparowane z normą odchylenie tego samego indeksu, a pasek błędu pokazuje +/- tej wartości.

Jednak gdy próbuję działki zarówno „mean1” oraz „mean2” w tej samej działce nie mogę skorzystać ze standardowego odchylenia w taki sam sposób:

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' 

Najbliżej Dostałem do mojego żądanego wyjścia jest to:

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

enter image description here

Ale teraz słupki błędów nie są wykreślane symetrycznie. Zamiast tego zielone i rozmyte paski w każdej serii używają tego samego błędu dodatniego i ujemnego i tu utknąłem. W jaki sposób mogę uzyskać paski błędów w moim pasku kontrolnym w wielu seriach, aby uzyskać podobny wygląd, jak wtedy, gdy miałem tylko jedną serię?

Aktualizacja: Wygląda to jest ustalona w pandas 0.14 czytałem docs 0,13 wcześniej. Nie mam teraz możliwości ulepszania moich pand. Zrobię to później i zobaczę, jak się okazuje.

+0

kiedykolwiek to wymyśliłeś? – pocketfullofcheese

+0

Nadal nie próbowałem go jeszcze w 0.14. Skończyło się korzystanie z matplotlib bezpośrednio w tym konkretnym przypadku. –

Odpowiedz

6

Roger, że Ajean i Alios!

Cóż, w końcu znalazłem odpowiedź na to pytanie. To jest coś, co staram się robić już od wielu dni. Problem był najwyraźniej problemem we wcześniejszej wersji Pandy. Zainstalowałem Pandas 0.15.0 i teraz możesz odwoływać się do innej ramki danych i używać danych do słupków błędów na zgrupowanych wykresach słupkowych, takich jak Ceflo, który próbował wykonać powyżej. Tak więc poniższy kod działa teraz w Pandach 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

Dobrze wiedzieć, że to działa. W aktualizacji w moim pytaniu zauważyłem, że to wydawało się być naprawione z pand w wersji 0.14. Ale nie miałem wtedy możliwości aktualizacji moich pand, a potem o tym zapomniałem =) –

Powiązane problemy