2017-04-04 1547 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