我这样在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)
我得到如下所示的输出
我想在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
答案 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')
默认情况下,文本左对齐(即与我们设置的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')
当然,与其手动标记所有内容,不如遍历数据并自动创建标签
for i, yr in enumerate(df['year'].unique()):
for j,gn in enumerate(df['geo_name'].unique()):
现在,您可以使用:i-0.4+(j*0.16)
遍历x位置,同时拥有year
和geo_name
的值来检索income
的正确值
答案 1 :(得分:1)
答案 2 :(得分:1)
matplotlib v3.4.2
matplotlib.pyplot.bar_label
pandas v1.2.4
进行测试,它使用 matplotlib
作为绘图引擎。fmt
参数,对自定义字符串格式使用 labels
参数。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')