matplotlib - 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>
同样的问题发生在图的底部。
任何解决方法来解决这个数字?
解决方案
您需要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和这个答案。
推荐阅读
- python - 在带有值的 ASP.net Core 中运行 Python 文件
- xamarin - 可观察集合中的动态记录
- java - SQLite:接近“假”:语法错误...如何解决单引号抛出错误
- javascript - Kendo 内联网格组合框 TypeError:无法使用“in”运算符在 null 中搜索“Id”
- php - 如何在 Laravel 7 导出中获取变量值?
- python - Python:如何自动更新数组中的引用元素?
- plot - 可以用 jsxgraph 制作波特图
- javascript - 更新 TinyMce 模板插件
- flutter - 如何使用 GetX 包获取 Flutter 中的当前语言环境?
- html - 如何将 h5 元素移动到 div 的左上角?