【问题标题】:seaborn in jupter notebook: why does sns.despine() work for lmplot but not regplot?jupyter notebook 中的 seaborn:为什么 sns.despine() 适用于 lmplot 而不是 regplot?
【发布时间】:2018-06-20 00:33:12
【问题描述】:

Jupyter 笔记本,使用 Python 3:

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.despine()

然后

snstest1 = sns.regplot(x="foo", y="bar", data=my_data)

显示带有不需要的边框的绘图(即 sns.despine() 似乎没有影响它)。

但是:

snstest2 = sns.lmplot(x="foo", y="bar", data=my_data)

显示正确删除了不需要的边框的绘图。

我能找到的唯一与此相关的文档如下,来自the api docs for regplot

了解 regplot() 和 lmplot() 之间的区别可以 有点棘手。事实上,它们是密切相关的,因为 lmplot() 使用 regplot() 内部并采用其大部分参数。然而, regplot() 是轴级函数,因此它直接绘制到轴上 (当前活动的轴或由 ax 提供的轴 参数),而 lmplot() 是一个图形级函数并创建其 自己的图形,通过 FacetGrid 管理。这有几 结果,即 regplot() 可以愉快地共存于一个图中 与其他类型的绘图,并将遵循全局 matplotlib 颜色 循环。相比之下,lmplot() 需要占据整个图形,而 大小和颜色循环通过函数参数控制, 忽略全局默认值。

但我不完全理解“图形”和“轴”之间的区别。在不知道这里的底层模型的情况下,我能做出的最好猜测是,当 Seaborn 中内置的这些奇怪的全局状态变异函数(如 despine 和(?)set_palette 等)处于活动状态时,只有“数字”,而不是“轴”在渲染之前检查该状态?但是,如果是这样,我将如何获得根据我的要求生成“轴”的东西?

【问题讨论】:

  • 也许不是骗子,但这个问题有助于解释图形和轴之间的差异 - stackoverflow.com/questions/47065244/…
  • 这很有帮助。我认为我真正想要的是学习底层的面向对象的接口,而不是在上面搞那些有漏洞的抽象!

标签: python matplotlib data-visualization seaborn


【解决方案1】:

简而言之:调用sns.despine 您的绘图功能之后。

更长的版本:

lmplot 创建自己的图形。但它不需要绝望。即使不调用sns.despine,它也会自动完成。

import matplotlib.pyplot as plt
import seaborn as sns

tips = sns.load_dataset("tips")
g = sns.lmplot(x="total_bill", y="tip", data=tips)

plt.show()

这就是问题中的代码实际上似乎有效的原因。
然而,真正发生的是,如果您在创建任何图形之前调用sns.despine,它将作用于新创建的图形。因此,问题中的代码创建了两个数字。一个是空的,但也是“despined”,然后一个是 lmplot 图形并且是“despined”,因为默认情况下每个 lmplot 都是despined。

regplot 是在 matplotlib 图形的轴中创建的。如果没有提供图形或轴,它将创建一个新的。这意味着sns.despine 需要知道要诅咒哪些轴。如果您先调用它,则会再次出现两个数字:一个是空的,但也是“被诅咒的”,然后是一个 regplot 数字。这个数字轴不是“被诅咒的”,因为没有人这么告诉他们。

所以想法当然是在创建情节之后调用sns.despine。您可以指定要指定的图形或轴作为参数 (sns.despine(ax=ax))

import matplotlib.pyplot as plt
import seaborn as sns

tips = sns.load_dataset("tips")
ax = sns.regplot(x="total_bill", y="tip", data=tips)
sns.despine(ax=ax)

plt.show()

但是,如果您只有一个甚至不需要的子图。因此

tips = sns.load_dataset("tips")
sns.regplot(x="total_bill", y="tip", data=tips)
sns.despine()

将同样有效并产生效果

【讨论】:

    猜你喜欢
    • 2019-07-16
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 2018-02-01
    • 2016-09-03
    • 2016-08-16
    • 2021-10-22
    • 2020-10-22
    相关资源
    最近更新 更多