2015-07-31 13 views
14

Biorąc pod uwagę następujący wykres liczenia, w jaki sposób umieszczać procenty na górze pasków?Jak dodawać procenty do barów u seaborn?

import seaborn as sns 
sns.set(style="darkgrid") 
titanic = sns.load_dataset("titanic") 
ax = sns.countplot(x="class", hue="who", data=titanic) 

enter image description here

Na przykład dla „pierwszy” Chcę całkowite pierwsi ludzie/suma pierwsze, całkowite Pierwsze kobiety/suma pierwszej i całkowite Pierwsze dzieci/suma Pierwszy na szczycie swoich barów.

Proszę dać mi znać, jeśli moje wyjaśnienie nie jest jasne.

Dzięki!

Odpowiedz

31

sns.barplot wyraźnie nie zwracają wartości barplot drogę matplotlib.pyplot.bar nie (patrz ostatnia para), ale jeśli już nic innego wykreślono można ryzykować przy założeniu, że wszystkie patches w osiach są twoje wartości. Następnie można korzystać z sumami, że funkcja barplot obliczył dla Ciebie:

from matplotlib.pyplot import show 
import seaborn as sns 
sns.set(style="darkgrid") 
titanic = sns.load_dataset("titanic") 
total = float(len(titanic)) # one person per row 
#ax = sns.barplot(x="class", hue="who", data=titanic) 
ax = sns.countplot(x="class", hue="who", data=titanic) # for Seaborn version 0.7 and more 
for p in ax.patches: 
    height = p.get_height() 
    ax.text(p.get_x()+p.get_width()/2., 
      height + 3, 
      '{:1.2f}'.format(height/total), 
      ha="center") 
show() 

produkuje

Countplot

Alternatywnym podejściem jest zrobić sub-zsumowanie wyraźnie, np ze znakomitym pandas i działką z matplotlib, a także samodzielnie wykonuj stylizację. (Chociaż można uzyskać całkiem sporo stylizacji z kontekstu sns, nawet przy użyciu funkcji kreślenia matplotlib. Wypróbuj -)

+0

Jest to zbliżone do tego, co chcę. Byłem niejasny w moich wyjaśnieniach. Chcę, aby procent "Pierwszego" sumował się do 1, "Drugi" do sumy do 1, "Trzeci" do sumy do 1. –

+1

To tylko inne równanie - widzisz gdzie 'wysokość/suma' jest? Idź z nim do miasta. – cphlewis

+0

Podoba mi się to podejście. Ta odpowiedź może pomóc w bardziej stylizowanej adnotacji: http://stackoverflow.com/questions/19917587/matplotlib-advanced-bar-plot/19919397#19919397 –