2015-09-11 48 views
1

我與seaborn工作,並試圖讓我的條形圖條形圖表更好看。在seaborn

import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 

x = ['One', 'Two', 'Three', 'Four', 'Five'] 
y = [2, 3, 0, 4.5, 4] 
y2 = [0, 0, -5, 0, 0] 

sns.axes_style('white') 
sns.set_style('white') 

b = sns.barplot(x,y,color='pink') 
sns.barplot(x,y2, color='red') 

for p in b.patches: 
    b.annotate(
     s='{:.1f}'.format(p.get_height()), 
     xy=(p.get_x()+p.get_width()/2.,p.get_height()), 
     ha='center',va='center', 
     xytext=(0,10), 
     textcoords='offset points' 
) 

b.set_yticks([]) 
sns.despine(ax=b, left=True, bottom=True) 

enter image description here

我竟拿出了標籤欄的代碼從堆棧溢出另一個線程。

我有即負杆被標記在正側的問題。我也想在每張圖的開始處擺脫零,並且可能將x = ['One','Two','Three','Four','Five']移動到零的中間,而不是在底部。

+0

我認爲你的主要問題是你打電話給barplot兩次。找到一種將它壓縮到一個通話的方式可能會有很大的幫助。此外,請提供您用於通知此帖的問題的鏈接。 –

+0

你應該嘗試限制這只是一個問題。我現在回答最後一個:'sns.despine(ax = b,bottom = True,left = True)'將擺脫框架。 –

+0

你得到的'0.0'的,因爲你通過所有的補丁的循環,所以你需要包括不標註一個條件時,p.get_height的'值()'不大於零。 –

回答

3

這裏有您需要做只1次來電,barplot並放置註解在x軸的正確的一面

import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 

x = ['One', 'Two', 'Three', 'Four', 'Five'] 
y = [2, 3, -5, 4.5, 4] 

sns.axes_style('white') 
sns.set_style('white') 

colors = ['pink' if _y >=0 else 'red' for _y in y] 
ax = sns.barplot(x, y, palette=colors) 

for n, (label, _y) in enumerate(zip(x, y)): 
    ax.annotate(
     s='{:.1f}'.format(abs(_y)), 
     xy=(n, _y), 
     ha='center',va='center', 
     xytext=(0,10), 
     textcoords='offset points', 
     color=color, 
     weight='bold' 
    ) 

    ax.annotate(
     s=label, 
     xy=(n, 0), 
     ha='center',va='center', 
     xytext=(0,10), 
     textcoords='offset points', 
    ) 
# axes formatting 
ax.set_yticks([]) 
ax.set_xticks([]) 
sns.despine(ax=ax, bottom=True, left=True) 

enter image description here

+0

無需兩次調用'barplot';剛剛過去想要作爲調色板的顏色列表。 – mwaskom

+1

此外,對於這種情節,從數據對象中獲取比從軸出來的條高度要簡單得多。 – mwaskom

+0

是的。刪除了額外的電話,但選擇繪圖後設置條形顏色。我想根據這些數據生成一個調色板會很容易。但是,既然我們正在通過酒吧循環,可能不值得。 –

0

感謝大家的意見的邏輯。 這是我的解決方案: 我已將負數移到列表的末尾。 (儘管沒有那麼大的差距)

import numpy as np 
import matplotlib.pyplot as plt 
import seaborn as sns 

x = ['One', 'Two', 'Three', 'Four', 'Five'] 
y = [2, 3, 4, 4.5, 0] 
y2 = [0, 0, 0, 0, -5] 

figure() 
sns.axes_style('white') 
b = sns.barplot(x,y2, color='red') 

for z in b.patches[4:5]: 
    b.annotate(np.round(-z.get_height(),decimals=6),(z.get_x()+z.get_width()/2.,-z.get_height()),ha='center',va='center',xytext=(0,10),textcoords='offset points', color='w') 

b=sns.barplot(x,y, color='blue') 
for p in b.patches[5:9]: 
    b.annotate(np.round(p.get_height(),decimals=6),(p.get_x()+p.get_width()/2.,p.get_height()),ha='center',va='center',xytext=(0,-10),textcoords='offset points', color='w')