由于seaborn使用matplotlib进行绘图,因此其大多数功能(全部?)都可以通过某种方式将参数传递给绘制绘图的基本matplotlib函数。这是一个很好的设计,它具有灵活性,而不会因过多的参数而使高级Seaborn功能混乱不堪。
但是,似乎有两种独立的机制可以做到这一点。有些函数只接受任意的关键字参数,而高级函数无法识别的任何参数都只是传递给底层的matplotlib函数。其他要求您将其他关键字参数放入字典中。
例如,seaborn.scatterplot
和seaborn.lmplot
都由AFAIK使用matplotlib.pyplot.scatter
作为基础绘图功能。如果我们想将s
参数传递给matplotlib.pyplot.scatter
以控制大小,则可以在seaborn.scatterplot
中将其添加到函数调用中:
sns.scatterplot(data=df, x='mpg',y='weight',s=10)
但是在seaborn.lmplot
中,我们必须将其填充到scatter_kws
字典中:
sns.lmplot(data=df, x='mpg',y='weight', scatter_kws={'s' : 10})
也许我遗漏了一些明显的东西,但是我无法弄清为什么使用这些不同的机制。是由于Seaborn工作方式内部的某些东西对最终用户不可见?是一种样式的遗产,而代码正在迁移到另一种样式?
答案 0 :(得分:1)
seaborn.lmplot
同时具有scatter_kws
和line_kws
参数。
scatter_kws
关键字dict传递给Matplotlib的scatter
函数的基础调用,而line_kws
传递给Matplotlib的plot
函数的基础调用。
由于底层的Matplotlib scatter
和plot
调用共有一些关键字参数(例如color
),因此使用两个字典可以使用户分别控制两者。也就是说,用户可以将散点图的颜色指定为红色,而线图的颜色可以为蓝色。
相反,sns.scatterplot
将其所有关键字参数发送给基础的Matplotlib scatter
调用。因此,不需要消除歧义。
答案 1 :(得分:1)
lmplot
将regplot
绘制到FacetGrid
上。 regplot
由一堆点(针对这些点使用scatter
)和一条线(针对其使用plot
)组成。
想象一下,您将参数s
传递给每个基础的matplotlib函数。它会被传递到scatter
,并在其中发挥作用,还会传递给plot
,后者没有任何s
参数。繁荣。错误。
此外,还有对两者均有效的参数,例如color
;但您可能希望重新绘制线的颜色与点的颜色不同。
这就是为什么在seaborn中的那些功能,使 combine 几种绘图类型允许这些单独的参数。