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)
这个问题背后的原因是lim
和ticks
不是独立的。 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 或 matplotlib 分组箱线图的数据格式
基于 DataFrame 列名的颜色 seaborn 箱线图