Seaborn的散点图和lmplot参数有什么区别?

3
一些快速加载:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

di = sns.load_dataset('iris')

使用这里提供的鸢尾花数据集示例。按照以下方式轻松创建散点图:
sns.scatterplot(x=di['sepal_length'], y=di['sepal_width'], 
            hue=di['species']);

然而,使用lmplot时会引发TypeError错误,并要求提供数据参数。即使数据参数已满足,它仍然无法正常工作。
sns.lmplot(x=di['sepal_length'], y=di['sepal_width'], 
            hue=di['species'], data=di);

TypeError: '<' not supported between instances of 'str' and 'float'

然而,这很好地运作:
sns.lmplot(x='sepal_length', y='sepal_width', hue='species', data=di);

阅读完API参考文档后,我发现lmplot需要数据参数,而scatterplot则不需要。这里是否有什么不同?另外,这里的语法最佳实践是什么?
1个回答

2
你的代码无法运行的原因是误用了 data 参数。在传递 data 参数时,xyhue 将被视为用于索引传递给 data 的对象,使用其 __getitem__ 方法。例如,x='sepal_length', y='sepal_width', data=di 等同于 x=di['sepal_length'], y=di['sepal_width']
因此,这段代码可以运行:
sns.lmplot(x='sepal_length', y='sepal_width', hue='species', data=di);

你试图做的基本上等同于 x=di[di['sepal_length']], y=di[di['sepal_width']], hue=di[di['species']]
回到你问题的第二个部分,关于 scatterplotlmplot 之间的区别: scatterplot 是一个 Axes 级别的函数;它仅依赖于 matplotlibAxes 对象,当绘制时,可以使用诸如 listsnp.ndarrays 等各种不同的集合类型。从功能上讲,它与 pyplot.scatter 函数基本相同,并带有一些默认的花哨颜色。
另一方面,`lmplot` 依赖于 `sns.FacetGrid`(文档可在这里找到)。`FacetGrid` 是一个纯粹的 `sns` 对象,在构建时需要一个 `pd.DataFrame`。因此,为了使 `lmplot` 正常工作,它必须使用一个 `pd.DataFrame`。

谢谢。所以,如果我在制作可视化时主要只使用pandas数据框,那么我是否应该只使用sns.FacetGrid和其他建立在其之上的函数?还是说这并不重要,只需使用更方便的东西。 - bbd108
2
相反,我认为如果你只使用 pandas 工作,那么这并不重要。另一方面,如果你在更低的抽象级别上使用存储在 listsarrays 中的数据,则选择使用哪些绘图/库就成为一个考虑因素。 - gmds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接