seaborn.lmplot вызывает ошибку ValueError при установке как `hue`, так и `scatter_kws`s `s`

#python #matplotlib #seaborn

#matplotlib #seaborn

Вопрос:

Этот код приведен в книге «Панды для всех» (3.4.3.2 Размер и форма).

 import seaborn as sns
from matplotlib import pyplot as plt

tips = sns.load_dataset('tips')
sns.lmplot(
    x='total_bill',
    y='tip',
    data=tips,
    fit_reg=False,
    hue='sex',
    scatter_kws={'s': tips['size'] * 10}
)
plt.show()
 

Когда я запускаю этот код, он выдает ошибку значения при matplotlib/axes/_axes.py строка 4508.

Ошибка ValueError: s должен быть скалярным или плавающим массивом с тем же размером, что и x и y

Эта ошибка не будет вызвана, если я опущу hue аргумент. Кажется, что данные ( tips['total_bill'] и tips['tip'] ) разделяются на sex , но tips['size'] не разделяются, поэтому длины разные.

Как я могу построить фигуру без ошибок?

Версии

  • Python 3.7
  • matplotlib 3.4.2
  • seaborn 0.11.1

Запускался как в Windows 10, так и в Google Colab.

Ответ №1:

  • Согласно выпуску seaborn 2621, lmplot с scatter_kws или relplot с s: ValueError: s должен быть скалярным или плавающим массивом с тем же размером, что и x и y, главный разработчик seaborn заявляет, что это не должно работать, lmplot и встревожен тем, что это в этой книге!.
    • Я полагаю, что причина, по которой он перестал «работать», заключается в том, что matplotlib добавил некоторую проверку ввода для выявления подобных случаев.
    • lmplot рисует отдельные диаграммы рассеяния для каждого уровня hue , но matplotlib kwargs просто передается прямо в scatter, поэтому эти векторы будут иметь разную длину.
  • Использование seaborn 0.11.1 и matplotlib 3.4.2

Используйте sns.scatterplot

 import seaborn as sns

tips = sns.load_dataset('tips')

sns.scatterplot(data=tips, x="total_bill", y="tip", hue="sex", size='size')
 

введите описание изображения здесь

 sns.scatterplot(data=tips, x="total_bill", y="tip", hue="sex", s=tips["size"].mul(20))
 

введите описание изображения здесь

Используйте sns.relplot

 import seaborn as sns

tips = sns.load_dataset('tips')

sns.relplot(data=tips, kind='scatter', x="total_bill", y="tip", hue="sex", size='size')
 

введите описание изображения здесь

 sns.relplot(data=tips, x='total_bill', y='tip', hue='sex', s=tips['size'].mul(20))
 

введите описание изображения здесь