Seaborn Barplot - 显示价值

时间:2017-04-04 18:31:00

标签: python pandas matplotlib seaborn

我希望看到如何在Seaborn中使用条形图显示数据框中的值,而不是图表中的值

1)我想在绘制另一个字段时显示数据框中一个字段的值。例如,下面,我正在绘制'tip',但我想将'total_bill'的值放在每个条形图上方(即星期五上方的325.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:'DataFrame'对象没有属性'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

8 个答案:

答案 0 :(得分:19)

让我们坚持链接问题(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

<小时/> 第二次尝试也很好,唯一的问题是rank()返回的排名从1开始而不是零。所以必须从数组中减去1。同样,对于索引,我们需要整数值,因此我们需要将其强制转换为int

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

答案 1 :(得分:8)

plt.figure(figsize=(15,10))
graph = sns.barplot(x='name_column_x_axis', y="name_column_x_axis", data = dataframe_name ,  color="salmon")
for p in graph.patches:
        graph.annotate('{:.0f}'.format(p.get_height()), (p.get_x()+0.3, p.get_height()),
                    ha='center', va='bottom',
                    color= 'black')

答案 2 :(得分:7)

使用单个斧头或斧头矩阵(子图)

<input type="file" id="file" onChange="fileChange()"/>

答案 3 :(得分:4)

matplotlib 3.4.0 中的新功能

现在有一个内置的 Axes.bar_label 来自动标记酒吧容器,所以现在标记变成了单行:

ax = sns.barplot(x='day', y='tip', data=groupedvalues)
ax.bar_label(ax.containers[0])

为了完整起见,对于颜色排名版本,这里是使用 Series.rankSeries.sub 的 Ernest 代码的稍微修改版本:

rank = groupedvalues.total_bill.rank().sub(1).astype(int)
palette = np.array(sns.color_palette('Blues_d', len(rank)))[rank]

ax = sns.barplot(x='day', y='tip', palette=palette, data=groupedvalues)
ax.bar_label(ax.containers[0])

sns.barplot labeled and ranked

答案 4 :(得分:2)

希望这有助于第2项: a)您可以按总账单排序,然后将索引重置为此列 b)使用palette =“Blue”使用此颜色将图表从浅蓝色缩放为深蓝色(如果深蓝色变为浅蓝色,则使用palette =“Blues_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")

答案 5 :(得分:1)

为了防止有人对水平条形图标注感兴趣,我对Sharon's answer进行了如下修改:

def show_values_on_bars(axs, h_v="v", space=0.4):
    def _show_on_single_plot(ax):
        if h_v == "v":
            for p in ax.patches:
                _x = p.get_x() + p.get_width() / 2
                _y = p.get_y() + p.get_height()
                value = int(p.get_height())
                ax.text(_x, _y, value, ha="center") 
        elif h_v == "h":
            for p in ax.patches:
                _x = p.get_x() + p.get_width() + float(space)
                _y = p.get_y() + p.get_height()
                value = int(p.get_width())
                ax.text(_x, _y, value, ha="left")

    if isinstance(axs, np.ndarray):
        for idx, ax in np.ndenumerate(axs):
            _show_on_single_plot(ax)
    else:
        _show_on_single_plot(axs)

解释了两个参数:

h_v-条形图是水平的还是垂直的。 "h"代表水平条形图,"v"代表垂直条形图。

space-值文本和条的顶部边缘之间的间隔。仅适用于水平模式。

示例:

show_values_on_bars(sns_t, "h", 0.3)

enter image description here

答案 6 :(得分:0)

一种简单的方法是添加以下代码(适用于Seaborn):

@import "../../scss/_variables.scss";

示例:

for p in splot.patches:
    splot.annotate(format(p.get_height(), '.1f'), 
                   (p.get_x() + p.get_width() / 2., p.get_height()), 
                   ha = 'center', va = 'center', 
                   xytext = (0, 9), 
                   textcoords = 'offset points') 

答案 7 :(得分:0)

import seaborn as sns

fig = plt.figure(figsize = (12, 8))
ax = plt.subplot(111)

ax = sns.barplot(x="Knowledge_type", y="Percentage", hue="Distance", data=knowledge)

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

相关问题