%matplotlib inline
import seaborn as sns
titanic = sns.load_dataset('titanic')
ax1 = sns.distplot(titanic['fare'], kde=False, bins=15,)
# ax1.set_yscale('log')
for p in ax1.patches:
ax1.annotate(
s=f"{p.get_height():1.0f}",
xy=(p.get_x() + p.get_width() / 2., p.get_height()),
xycoords='data',
ha='center',
va='center',
fontsize=11,
color='black',
xytext=(0,7),
textcoords='offset points',
)
上面的代码绘制了钛酸数据集Fare
的直方图,其中每个条形都使用ax1.annotate
标注了其值。
当我想将y比例尺设置为logc时会遇到麻烦–取消注释set_yscale
行并运行它;它会抛出一个错误:
ValueError:图像尺寸378x84035像素太大。每个方向上的距离都必须小于2 ^ 16。
也许应该更改xycoords参数,但是我不太确定该如何更改。
我使用的是Python 3.7.2,seaborn是0.9.0版。 Matplotlib版本3.0.2,我使用的是Inline后端。
答案 0 :(得分:3)
一些注释位于y=0
处。这将导致位置在对数刻度上不确定。
在具有嵌入式后端的Jupyter笔记本电脑中,用于显示图形的默认选项是通过bbox_inches="tight"
的{{1}}选项运行图形。这样,这种“紧密”的算法就无法定位标签,并且会扩展图形的大小以将它们包括在内。
我在这里建议的解决方案是将批注的savefig
选项设置为clip_on
。这样可以防止显示轴外的注释。因此,它解决了在对数刻度上零放置注释的问题。
True