Причина, по которой ваш код не работает, - неправильное использование аргумента data
. Когда передается data
, x
, y
и hue
будут обрабатываться как объекты, с помощью которых можно проиндексировать объект, переданный в 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']]
.
Возвращаясь ко второй части вашего вопроса о разнице между scatterplot
и lmplot
:
scatterplot
- функция Axes
-уровня; он полагается только на объект matplotlib
Axes
, который при построении графика может работать с такими различными типами коллекций, как lists
и np.ndarrays
. Функционально, более или менее, он такой же, как pyplot.scatter
с некоторыми необычными цветами по умолчанию.
С другой стороны, lmplot
опирается на sns.FacetGrid
(документация доступна здесь ). FacetGrid
- это чисто sns
объект, для создания которого требуется pd.DataFrame
. Соответственно, поэтому, чтобы lmplot
работал, он должен взять pd.DataFrame
.