Почему легенда, отображаемая в Seaborn JointGrid, неверна? - PullRequest
1 голос
/ 22 апреля 2020

Я экспериментирую с JointGrid от Seaborn. Я использовал .plot_joint(), чтобы построить график рассеяния, цвет группы, используя параметр hue. Я отфильтровал свой набор данных, чтобы он включал только 2 из 5 групп, чтобы предотвратить слишком частое совпадение на графиках.

Точки на графике выглядят правильно, так как они соответствуют тому, что я ожидаю от двух выбранных мной групп. Кроме того, я дважды проверил свою фильтрацию, просмотрев отфильтрованный фрейм данных. Это тоже было правильно, поскольку в нем были только две выбранные мной группы.

Однако легенда, которая автоматически наносится вместе с диаграммой рассеяния, неверна. Это показывает 4 группы (не уверен, почему не 5), и раскраска также неверна. Для 2 групп я бы ожидал только красный и синий цвета (первые 2 цвета в палитре Set1), но моя вторая группа окрашена в 4-й цвет в палитре Set1.

plt.rcParams['figure.figsize'] = (12, 4)
df_tmp = df[df.Kmeans_Clusters.isin([0, 3])].copy()

# initialize Joint Grid
grid = sns.JointGrid(data=df_tmp, x='MP', y='PTS')

# plot scatter (main plot)
grid = grid.plot_joint(sns.scatterplot, data=df_tmp, hue='Kmeans_Clusters',
                       palette='Set1')

# plot marginal distplot for cluster 0, X & Y
sns.distplot(df_tmp[df_tmp.Kmeans_Clusters == 0].MP, ax=grid.ax_marg_x,
             vertical=False, color='firebrick', label='Cluster0')
sns.distplot(df_tmp[df_tmp.Kmeans_Clusters == 0].PTS, ax=grid.ax_marg_y,
             vertical=True, color='firebrick', label='Cluster0')

# plot marginal distplot for cluster 3, X & Y
sns.distplot(df_tmp[df_tmp.Kmeans_Clusters == 3].MP, ax=grid.ax_marg_x,
             vertical=False, color='steelblue', label='Cluster3')
sns.distplot(df_tmp[df_tmp.Kmeans_Clusters == 3].PTS, ax=grid.ax_marg_y,
             vertical=True, color='steelblue', label='Cluster3')

plt.suptitle('PTS vs MP, Cluster 0 & 3\n1982-2019', y=1.05, fontsize=20)
plt.show()

jointgrid_incorrect_legend_and_coloring

--- Обновление --- Я только что попробовал это с простым scatterplot (нет JointGrid), и я могу повторить свое предыдущее наблюдение. Есть ли что-то, чего я не понимаю с параметром hue и функцией scatterplot()?

Я не вижу этой проблемы с lmplot()

plt.rcParams['figure.figsize'] = (12, 4)
df_tmp = df[df.Kmeans_Clusters.isin([0, 3])].copy()
sns.scatterplot(data=df_tmp, y='PTS', x='MP', hue='Kmeans_Clusters', palette='Set1')
plt.title('PTS vs MP\n1982-2019')
plt.xlabel('Minutes Played Annually')
plt.ylabel('Points Scored Annually')
plt.show()

1 Ответ

0 голосов
/ 22 апреля 2020

Опять же, как только я настроил свои поиски, я смог найти решение. Фактически, вот еще один вопрос stackoverflow, в котором задается то же самое и дан подробный ответ: Параметр `hue` в Seaborn.relplot () пропускает целое число при получении числовых данных? .

Вставьте решение, которое я использовал, как описано в приведенной выше ссылке:

"" "Альтернатива - убедиться, что значения обрабатываются категорически. К сожалению, даже если вы включите числа в виде строк, они будут преобразованы в числа возвращаются к тому же механизму, который описан выше. Это может рассматриваться как ошибка.

Однако, у вас есть выбор - использовать реальные категории, такие как, например, отдельные буквы.

'cluster' : list ("ABCDE")

отлично работает, "" "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...