#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
, но matplotlibkwargs
просто передается прямо в 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))