Как я могу указать несколько переменных для параметров оттенка при построении с Seaborn? - PullRequest
0 голосов
/ 23 февраля 2020

При использовании seaborn , есть ли способ включить несколько переменных (столбцов) для параметра hue ? Другой способ задать этот вопрос - как я могу сгруппировать свои данные по нескольким переменным, прежде чем наносить их на один график по осям x, y?

Я хочу сделать что-то вроде ниже. Однако в настоящее время я не могу указать две переменные для параметра hue .:

sns.relplot(x='#', y='Attack', hue=['Legendary', 'Stage'], data=df)

Например, предположим, что у меня есть pandas DataFrame, подобный приведенному ниже, содержащий База данных покемонов получена с помощью этого учебного пособия.

enter image description here

Я хочу нанести на ось X pokedex # , а ось Y Attack . Однако я хочу, чтобы данные были сгруппированы по Stage и Legendary . Используя matplotlib , я написал пользовательскую функцию, которая группирует фрейм данных по ['Legendary', 'Stage'] , а затем перебирает каждую группу для построения графика (см. Результаты ниже). Хотя моя пользовательская функция работает как задумано, я надеялся, что это может быть достигнуто просто с помощью Seaborn. Я предполагаю, что должны быть другие люди, которые пытались визуализировать более 3 переменных на одном графике, используя морского рожка?

fig, ax = plt.subplots()
grouping_variables = ['Stage','Legendary']
group_1 = df.groupby(grouping_variables)
for group_1_label, group_1_df in group_1:
    ax.scatter(group_1_df['#'], group_1_df['Attack'], label=group_1_label)
ax_legend = ax.legend(title=grouping_variables)    

enter image description here

Редактировать 1:

Примечание. В представленном примере я сгруппировал данные по двум переменным ( например: Легендарный и Сценический). Однако в других ситуациях может потребоваться произвольное количество переменных (например, 5 переменных).

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

В seaborn scatterplot() вы можете комбинировать параметры hue= и style= для получения разных маркеров и разных цветов для каждой комбинации

пример (дословно взято из документации *) 1007 *):

tips = sns.load_dataset("tips")
ax = sns.scatterplot(x="total_bill", y="tip", data=tips)
ax = sns.scatterplot(x="total_bill", y="tip",
                     hue="day", style="time", data=tips)

enter image description here

0 голосов
/ 24 февраля 2020

Чтобы использовать оттенок из seaborn.relplot, рассмотрите возможность объединения необходимых групп в один столбец, а затем запустите график для новой переменной:

def run_plot(df, flds):
   # CREATE NEW COLUMN OF CONCATENATED VALUES
   df['_'.join(flds)] =  pd.Series(df.reindex(flds, axis='columns')
                                     .astype('str')
                                     .values.tolist()
                                  ).str.join('_')

   # PLOT WITH hue
   sns.relplot(x='#', y='Attack', hue='_'.join(flds), data=random_df, aspect=1.5)
   plt.show()

   plt.clf()
   plt.close()

Для демонстрации со случайными данными

Данные

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns

### DATA
np.random.seed(22320)
random_df = pd.DataFrame({'#': np.arange(1,501),
                          'Name': np.random.choice(['Bulbasaur', 'Ivysaur', 'Venusaur', 
                                                    'Charmander', 'Charmeleon'], 500),
                          'HP': np.random.randint(1, 100, 500),
                          'Attack': np.random.randint(1, 100, 500),
                          'Defense': np.random.randint(1, 100, 500),
                          'Sp. Atk': np.random.randint(1, 100, 500),
                          'Sp. Def': np.random.randint(1, 100, 500),
                          'Speed': np.random.randint(1, 100, 500),
                          'Stage': np.random.randint(1, 3, 500),
                          'Legend': np.random.choice([True, False], 500)
                          })

Участки

run_plot(random_df, ['Legend', 'Stage'])

Two Group Plot Output

run_plot(random_df, ['Legend', 'Stage', 'Name'])

Three Group Plot

...