Seaborn:需要解决箱线图中图形边距的方法[重复]

Posted

技术标签:

【中文标题】Seaborn:需要解决箱线图中图形边距的方法[重复]【英文标题】:Seaborn: need workaround for figure margin in boxplot [duplicate] 【发布时间】:2020-02-19 06:49:38 【问题描述】:

我在 Jupyter Notebook 中的 Seaborn 中有一个奇怪的行为。我画了一个bloxplots列表,它打印得很好:

sns.boxplot(
data=df_enem, y='CO_ESCOLA', x='nota_final', orient='h', 
order=df_melhores.head(NUM_MELHORES).CO_ENTIDADE)

图表顶部很好,如您在此屏幕截图中所见:

现在我打印完全相同的图表,但是获取并设置了yticks,并且图形边距搞砸了:

ax = sns.boxplot(data=df_enem, y='CO_ESCOLA', x='nota_final', orient='h', 
                 order=df_melhores.head(NUM_MELHORES).CO_ENTIDADE)
locs, labels = plt.yticks()
plt.yticks(locs, labels);

如果我打印 locs 和 labels 变量,我会得到:

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39] <a list of 40 Text yticklabel objects>

同样的问题出现在图的底部。

有什么办法可以解决这个问题?

【问题讨论】:

降级到 3.1.0 解决了这个问题。 【参考方案1】:

您需要在更改yticks 之前记录您的ylim,然后在更改刻度后将其重新设置。像这样的东西应该可以正常工作:

ylim=ax.get_ylim()    
locs, labels = plt.yticks()
plt.yticks(locs, labels)
ax.set_ylim(ylim)

这个问题背后的原因是limticks 不是独立的ticks 只是您限制内的离散点。因此,当您设置 yticks 时,图形的限制将更改为匹配第一个/最后一个 ytick 元素。您可以通过一个简单的示例看到这一点:

iris = sns.load_dataset("iris")
ax = sns.boxplot(data=iris, orient="h", palette="Set2")
ylim=ax.get_ylim()

ylim 是:(3.5, -0.5)。如果我们现在更改yticks 并再次检查ylim

yticks = ax.get_yticks()
ax.set_yticks(yticks)
ylim=ax.get_ylim()

我们有:

In [38]: yticks
Out[38]: array([0, 1, 2, 3])
In [39]: ylim
Out[39]: (3.0, 0.0)

附言 这不是与 seaborn 相关的问题,而是 matplotlib 的工作方式。有关更多信息,您可以查看ticker api 和此answer。

【讨论】:

解决方法是可以的,但是这里的分析是错误的。这是由于 matplotlib 3.1.1 中的一个错误。所以使用任何其他版本的 matplotlib。因此,我作为 this 的副本关闭。

以上是关于Seaborn:需要解决箱线图中图形边距的方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在seaborn中绘制多个箱线图?

使用 seaborn 或 matplotlib 分组箱线图的数据格式

使用 seaborn 的单个箱线图中的多列

基于 DataFrame 列名的颜色 seaborn 箱线图

如何在 Seaborn 箱线图中编辑胡须、传单、帽子等的属性

同一图上 Pandas 数据框多列的箱线图(seaborn)