首页 > 解决方案 > Seaborn:需要解决箱线图中图形边距的方法

问题描述

我在 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>

同样的问题发生在图的底部。

任何解决方法来解决这个数字?

标签: matplotlibseaborn

解决方案


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

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)

ps这不是与seaborn相关的问题,而只是matplotlib的工作方式。有关更多信息,您可以查看ticker api和这个答案


推荐阅读