2017-04-04 266 views
0

我想看看如何做兩件事情在Seaborn用條形圖顯示了在數據幀值,但不能在我期待的圖形Seaborn Barplot - 顯示值

1)在數據框中顯示一個字段的值,同時繪製另一個字段的圖形。例如,下面,我正在繪製'小費',但我希望將'total_bill'的值放在每個小節上方(即星期五以上350.88,星期六以上 1778.40等)。

2 )是否有一種方法可以縮放條的顏色,其中'total_bill'的最低值具有最淺的顏色(本例中爲星期五),而'total_bill'的最高值具有最暗的顏色。顯然,當我進行縮放時,我會堅持使用一種顏色(即藍色)。

謝謝!我相信這很容易,但我很想念它。

雖然我看到別人認爲這是另一個問題(或兩個)的重複,但我錯過了如何使用值不在圖中作爲標籤或陰影的基礎。我怎麼說,使用total_bill作爲基礎。我很抱歉,但根據這些答案我無法弄清楚。

用下面的代碼開始,

import pandas as pd 
import seaborn as sns 
%matplotlib inline 
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata- book/master/ch08/tips.csv", sep=',') 
groupedvalues=df.groupby('day').sum().reset_index() 
g=sns.barplot(x='day',y='tip',data=groupedvalues) 

我得到以下結果:

enter image description here

臨時解決方案:

for index, row in groupedvalues.iterrows(): 
    g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center") 

enter image description here

陰影,使用下面的例子,我試過如下:

import pandas as pd 
import seaborn as sns 
%matplotlib inline 
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',') 
groupedvalues=df.groupby('day').sum().reset_index() 

pal = sns.color_palette("Greens_d", len(data)) 
rank = groupedvalues.argsort().argsort() 
g=sns.barplot(x='day',y='tip',data=groupedvalues) 

for index, row in groupedvalues.iterrows(): 
    g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center") 

但是,這給了我以下錯誤:

AttributeError的: '據幀' 對象沒有屬性'argsort'

所以我嘗試了一個修改:

import pandas as pd 
import seaborn as sns 
%matplotlib inline 
df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',') 
groupedvalues=df.groupby('day').sum().reset_index() 

pal = sns.color_palette("Greens_d", len(data)) 
rank=groupedvalues['total_bill'].rank(ascending=True) 
g=sns.barplot(x='day',y='tip',data=groupedvalues,palette=np.array(pal[::-1])[rank]) 

而且給我留下了

IndexError:指數4是出界對軸0與4號

+1

http://matplotlib.org/users/annotations.html –

+1

你真的SEACH張貼問題之前的解決方案? [這裏](http://stackoverflow.com/questions/31749448/how-to-add-percentages-on-top-of-bars-in-seaborn)是一種方式來設置標籤在酒吧和[這裏](http ://stackoverflow.com/questions/36271302/changing-color-scale-in-seaborn-bar-plot)是一種方式來改變酒吧的顏色。如果您在實施任一解決方案時遇到問題,可以詢問有關問題的具體問題。 – ImportanceOfBeingErnest

+0

可能的重複[如何添加在seaborn上的酒吧的百分比?](http://stackoverflow.com/questions/31749448/how-to-add-percentages-on-top-of-bars-in-seaborn) – ImportanceOfBeingErnest

回答

7

讓我們堅持從鏈接問題的解決方案(Changing color scale in seaborn bar plot)。您想使用argsort來確定用於彩色條紋的顏色順序。在鏈接的問題中,argsort應用於Series對象,該對象可以正常工作,而在這裏您有一個DataFrame。所以你需要選擇那個DataFrame的一列來應用argsort。

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

df = sns.load_dataset("tips") 
groupedvalues=df.groupby('day').sum().reset_index() 

pal = sns.color_palette("Greens_d", len(groupedvalues)) 
rank = groupedvalues["total_bill"].argsort().argsort() 
g=sns.barplot(x='day',y='tip',data=groupedvalues, palette=np.array(pal[::-1])[rank]) 

for index, row in groupedvalues.iterrows(): 
    g.text(row.name,row.tip, round(row.total_bill,2), color='black', ha="center") 

plt.show() 

enter image description here


第二次嘗試工作正常爲好,唯一的問題是,截至 1,而不是零返回由 rank()開始軍銜。所以必須從數組中減去1。同樣對於索引,我們需要整數值,所以我們需要將其轉換爲 int

rank = groupedvalues['total_bill'].rank(ascending=True).values 
rank = (rank-1).astype(np.int) 
1

希望這有助於爲項目#2: a)您可以通過總排序b)使用調色板=「藍色」使用此顏色將圖表從淺藍色調整爲深藍色(如果深藍色變爲淺藍色,則使用調色板=「藍調_d」)

import pandas as pd 
import seaborn as sns 
%matplotlib inline 

df=pd.read_csv("https://raw.githubusercontent.com/wesm/pydata-book/master/ch08/tips.csv", sep=',') 
groupedvalues=df.groupby('day').sum().reset_index() 
groupedvalues=groupedvalues.sort_values('total_bill').reset_index() 
g=sns.barplot(x='day',y='tip',data=groupedvalues, palette="Blues") 
+0

在這裏,您仍然按照出現在圖中條的順序應用調色板([最左邊的條具有最淺的顏色](https://i.stack.imgur.com/Gy5vC.png))。這個想法(也在鏈接問題中提出)將按與排序的「total_bill」列相同的順序對顏色進行排序,以使總賬單最大的列具有最黑的顏色。 – ImportanceOfBeingErnest

+0

是的,你是對的。我沒有意識到這個問題與我看到你的帖子之前我對它的理解有什麼不同。謝謝 – anonyXmous