Seaborn Catplot在条形图上设置值

时间:2019-04-09 07:05:49

标签: python python-3.x plot data-visualization seaborn

我这样在catplot中绘制了一个seaborn

g = sns.catplot(x='year', y='income', data=df, kind='bar', hue='geo_name', legend=True)
g.fig.set_size_inches(15,8)
g.fig.subplots_adjust(top=0.81,right=0.86)  

我得到如下所示的输出

enter image description here

我想在K表示形式的顶部添加每个条形的值。例如 在2013中,Michigan的栏位于48411,因此我想在该栏的顶部添加值48.4K。所有酒吧也一样。

我正在使用的数据发布在下面。

year,geo_name,geo,income,income_moe
2016,Michigan,04000US26,50803.0,162.0
2013,Michigan,04000US26,48411.0,163.0
2014,Michigan,04000US26,49087.0,192.0
2015,Michigan,04000US26,49576.0,186.0
2016,"Washtenaw County, MI",05000US26161,62484.0,984.0
2013,"Washtenaw County, MI",05000US26161,59055.0,985.0
2014,"Washtenaw County, MI",05000US26161,60805.0,958.0
2015,"Washtenaw County, MI",05000US26161,61003.0,901.0
2016,"Ann Arbor, MI",16000US2603000,57697.0,2046.0
2013,"Ann Arbor, MI",16000US2603000,55003.0,1688.0
2014,"Ann Arbor, MI",16000US2603000,56835.0,1320.0
2015,"Ann Arbor, MI",16000US2603000,55990.0,1259.0
2016,"Philadelphia, PA",16000US4260000,39770.0,567.0
2013,"Philadelphia, PA",16000US4260000,37192.0,424.0
2014,"Philadelphia, PA",16000US4260000,37460.0,430.0
2015,"Philadelphia, PA",16000US4260000,38253.0,511.0
2016,"Ann Arbor, MI Metro Area",31000US11460,62484.0,984.0
2013,"Ann Arbor, MI Metro Area",31000US11460,59055.0,985.0
2014,"Ann Arbor, MI Metro Area",31000US11460,60805.0,958.0
2015,"Ann Arbor, MI Metro Area",31000US11460,61003.0,901.0

3 个答案:

答案 0 :(得分:1)

这是一个粗略的解决方案,但是可以解决问题。

我们将文本添加到由绘图创建的axes对象中。

Y位置很简单,因为它与数据值完全对应。我们可能只向每个值添加500,以便标签位于列的顶部。 X位置从第一组列(2013)开始并以0为中心,并以一个单位间隔。我们在每一侧都有0.1的缓冲区,列为5,因此每列的宽度为0.16。

g = sns.catplot(x='year', y='income', data=df, kind='bar', hue='geo_name', legend=True)
#flatax=g.axes.flatten()
#g.axes[0].text=('1')
g.fig.set_size_inches(15,8)
g.fig.subplots_adjust(top=0.81,right=0.86)
g.ax.text(-0.5,51000,'X=-0.5')
g.ax.text(-0.4,49000,'X=-0.4')
g.ax.text(0,49000,'X=0')
g.ax.text(0.5,51000,'X=0.5')
g.ax.text(0.4,49000,'X=0.4')
g.ax.text(0.6,47000,'X=0.6')

limits

默认情况下,文本左对齐(即与我们设置的x值)对齐。 Here是文档,如果您想使用文本(更改字体,对齐方式等)

然后,每个组的第三列将始终以单位(0,1,2,3,4)为中心,我们可以为每个标签找到合适的位置。

g = sns.catplot(x='year', y='income', data=df, kind='bar', hue='geo_name', legend=True)
#flatax=g.axes.flatten()
#g.axes[0].text=('1')
g.fig.set_size_inches(15,8)
g.fig.subplots_adjust(top=0.81,right=0.86)
g.ax.text(-0.4,48411+500,'48,4K')
g.ax.text(-0.24,59055+500,'59,0K')
g.ax.text(-0.08,55003+500,'55,0K')
g.ax.text(0.08,37192+500,'37,2K')
g.ax.text(0.24,59055+500,'59,0K')

labelled

当然,与其手动标记所有内容,不如遍历数据并自动创建标签

for i, yr in enumerate(df['year'].unique()):
    for j,gn in enumerate(df['geo_name'].unique()):

现在,您可以使用:i-0.4+(j*0.16)遍历x位置,同时拥有yeargeo_name的值来检索income的正确值

答案 1 :(得分:1)

我们可以使用sns.catplot()返回的Facet网格并选择轴。使用for循环使用ax.text()

将Y轴值定位为所需的格式
'STUDENT'

catplot demo

答案 2 :(得分:1)

更新于 matplotlib v3.4.2

g = sns.catplot(x='year', y='income', data=df, kind='bar', hue='geo_name', legend=True)
g.fig.set_size_inches(15, 8)
g.fig.subplots_adjust(top=0.81, right=0.86)

# extract the matplotlib axes_subplot objects from the FacetGrid
ax = g.facet_axis(0, 0)

# iterate through the axes containers
for c in ax.containers:
    labels = [f'{(v.get_height() / 1000):.1f}K' for v in c]
    ax.bar_label(c, labels=labels, label_type='edge')

enter image description here