注释改变情节?

时间:2018-02-21 20:15:51

标签: python matplotlib annotations seaborn

通常当我绘制一些分布时,我喜欢插入辅助线来显示额外信息,例如mean:

plt.figure(figsize=(15, 5))
h = r1['TAXA_ATUAL_UP'].mean()
plt.axvline(h, color='k', linestyle='dashed', linewidth=2)
print(h) # 692.6621026418171
plt.annotate('{0:.2f}'.format(h), xy=(h+100, 0.02), fontsize=12)

sns.distplot(r1['TAXA_ATUAL_UP'].dropna())
sns.distplot(r1[r1['REMOTO'] == 1]['TAXA_ATUAL_UP'].dropna(), hist=False, label='Y = 1')
sns.distplot(r1[r1['REMOTO'] == 0]['TAXA_ATUAL_UP'].dropna(), hist=False, label='Y = 0')

enter image description here

最近,使用相同的代码绘制其他数据,我得到了一个奇怪的结果。基本上,我注意到h值很大,结果是情节急剧减少:

plt.figure(figsize=(15, 5))
h = r1['TAXA_ATUAL_DOWN'].mean()
plt.axvline(h, color='k', linestyle='dashed', linewidth=2)
print(h) # 8777.987291627895
plt.annotate('{0:.2f}'.format(h), xy=(h, 0.02), fontsize=12)

sns.distplot(r1['TAXA_ATUAL_DOWN'].dropna())
sns.distplot(r1[r1['REMOTO'] == 1]['TAXA_ATUAL_DOWN'].dropna(), hist=False, label='Y = 1')

enter image description here

我想知道是什么原因造成我应该如何使注释正常工作,或者解决我做错了什么。

1 个答案:

答案 0 :(得分:1)

尝试替换

plt.annotate('{0:.2f}'.format(h), xy=(h, 0.02), fontsize=12)

plt.annotate('{0:.2f}'.format(h), xy=(h+100, 0.00012), fontsize=12)

我相信正在发生的事情是你试图在与旧图中相同的xy坐标上进行注释,但轴刻度完全不同。因此,当您在xy=(h,0.02)处注释时,0.02明显高于您的y轴的最大值,并且您的数字会相应地重新缩放。

看一下你的新情节,看起来将你的文字放在像xy=(h+100, 0.00012)这样的地方,或者某处的某个地方会更有意义。如果可行,您可以根据需要调整位置(或者,更通过编程方式,将y坐标放在0.75 * maximum_y_value之类的位置,其中maximum_y_value是y轴上的最高点)。

一个hacky但有效的方法是使用

y_max = max([h.get_height() for h in sns.distplot(r1[r1['REMOTO'] == 1]['TAXA_ATUAL_DOWN'].dropna()).patches])

plt.annotate('{0:.2f}'.format(h), xy=(h, 0.75*y_max), fontsize=12)

实际上做的是获取默认情况下在sns.distplot(您已禁用)中绘制的直方图的值,并找到其中的最大值。