用对数刻度注释seaborn distplot会引发错误

时间:2019-03-23 16:04:09

标签: python python-3.x matplotlib seaborn

%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后端。

1 个答案:

答案 0 :(得分:3)

一些注释位于y=0处。这将导致位置在对数刻度上不确定。
在具有嵌入式后端的Jupyter笔记本电脑中,用于显示图形的默认选项是通过bbox_inches="tight"的{​​{1}}选项运行图形。这样,这种“紧密”的算法就无法定位标签,并​​且会扩展图形的大小以将它们包括在内。

我在这里建议的解决方案是将批注的savefig选项设置为clip_on。这样可以防止显示轴外的注释。因此,它解决了在对数刻度上零放置注释的问题。

True