<p>这是一个粗略的解决方案,但确实有效</p>
<p>我们将文本添加到由plot创建的<code>axes</code>对象中</p>
<p><code>Y</code>位置很简单,因为它与数据值完全对应。我们可以只向每个值添加<code>500</code>,这样标签就可以很好地位于列的顶部。
<code>X</code>位置开始,第一组列(2013)的中心位置为0,并分隔一个单元。我们在每一侧有一个<code>0.1</code>的缓冲区,列为5,因此每列的宽度为0.16</p>
<pre><code>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')
</code></pre>
<p><a href="https://i.stack.imgur.com/QYvty.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/QYvty.png" alt="limits"/></a></p>
<p>默认情况下,文本是左对齐的(即与我们设置的<code>x</code>值对齐)<a href="https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.text.html#matplotlib.axes.Axes.text" rel="nofollow noreferrer">Here</a>是要处理文本(更改字体、对齐方式等)的文档</p>
<p>然后,我们可以找到每个标签的正确位置,知道每个组的第三列始终以单元(0,1,2,3,4)为中心</p>
<pre><code>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')
</code></pre>
<p><a href="https://i.stack.imgur.com/JWjL6.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/JWjL6.png" alt="labelled"/></a></p>
<p>当然,您不应该手动标记所有内容,而应该在数据中循环并自动创建标签</p>
<pre><code>for i, yr in enumerate(df['year'].unique()):
for j,gn in enumerate(df['geo_name'].unique()):
</code></pre>
<p>现在,您可以使用:<code>i-0.4+(j*0.16)</code>遍历x位置,同时使用<code>year</code>和<code>geo_name</code>的值来检索<code>income</code>的正确值</p>