использование pandas .DataFrame.melt () для отображения данных с помощью seaborn - PullRequest
2 голосов
/ 10 марта 2020

Итак, у меня есть некоторые данные в двух столбцах в Pandas DataFrame:

Actual  Predicted
0   2.8 2.854729
1   2.2 3.081473
2   4.2 3.211041
3   2.9 2.951905
4   3.4 3.211041
5   3.3 2.838533
6   3.5 3.194845
7   3.1 3.000493
8   2.8 3.016689
9   2.8 3.032885

Я хочу научиться отображать свои данные с помощью трех общих библиотек. Все они, кажется, основаны друг на друге, но реализация очень отличается. До сих пор я достиг того же сюжета, используя Pandas и Matplotlib. Путь Pandas был очень легким, а matplotlib - неоправданно сложным (просто мнение).

# Plot with Pandas DataFrame.plot()
df.plot(kind='bar', figsize=(16,10))

# Plot with matplotlib 
plt.figure(figsize=(16,10))
plt.bar(df.index - .35/2, df.iloc[:,0], .35, label='Actual')
plt.bar(df.index + .35/2, df.iloc[:,1], .35, label='Predicted')
plt.legend()

Сейчас я пытаюсь выяснить Seaborn, используя их документы, но мне трудно понять, какими должны быть мои значения x и y. На мой взгляд:

  • x - df.index Поскольку я хочу, чтобы все точки данных были расположены вдоль оси x

  • y - I хотите, чтобы значения 'y' были двойными: фактическое и прогнозируемое. Не знаю, как это сделать.

  • hue - df.columns, так как я хочу иметь один столбец, представляющий фактический, и один, представляющий прогнозируемый

Однако это не работает вообще, и ни одна из этих попыток не выполняется:

sns.barplot(x=df.index, y=df.columns, data=df) 

sns.barplot(data=df)

Моя интуиция заключается в том, что мне нужно использовать функцию DataFrame.melt (), чтобы получить свои данные в длинный формат для лучшего построения графика, но я попробовал это:

df2 = df.melt(var_name='Type', value_name='Measurement')
df2


Type    Measurement
0   Actual  2.800000
1   Actual  2.200000
2   Actual  4.200000
3   Actual  2.900000
4   Actual  3.400000
... ... ...
85  Predicted   2.903317
86  Predicted   3.211041
87  Predicted   2.870925
88  Predicted   3.146257
89  Predicted   3.211041

Но это лишает меня шансов получить правильные столбцы рядом друг с другом, так как он объединяет все «фактические» значения вместе, отдельно от всех «Предсказанные» значения.

Я все равно попробовал в надежде, что это каким-то образом правильно сгруппирует столбики. Я использовал шаблон, который взят из примеров ниже на странице документации для seaborn.barplot, и получил ValueError: Could not interpret input 'Measurement':

sns.barplot(x=df.index, y='Measurement', hue='Type')

Так что я думаю, все это сводится к правильному использованию функции плавления, но Я в полной растерянности на данный момент. Мои глаза сейчас кровоточат, потому что документация так запутана. Мне сказали, что Морской Рожок был самым простым способом заговора, и он оказался самым сложным.

Я думаю, мои данные должны выглядеть следующим образом:

    Type        Measurement
0   Actual      2.800000
    Predicted   2.903317
1   Actual      2.200000
    Predicted   3.211041
... ... ...

И тогда я мог бы следовать примеру кода для seaborn.barplot ():

sns.barplot(x=df.index, y="Measurement", hue="type", data=df)

Или хотя бы это то, на что я надеюсь ...

1 Ответ

3 голосов
/ 10 марта 2020

Хитрость в том, чтобы сбросить индекс перед плавлением ... это будет ваш x параметр:

df_melted = df.reset_index().melt(id_vars='index')

#     index   variable     value
# 0       0     Actual  2.800000
# 1       1     Actual  2.200000
# 2       2     Actual  4.200000
# 3       3     Actual  2.900000
# 4       4     Actual  3.400000
# 5       5     Actual  3.300000
# 6       6     Actual  3.500000
# 7       7     Actual  3.100000
# 8       8     Actual  2.800000
# 9       9     Actual  2.800000
# 10      0  Predicted  2.854729
# 11      1  Predicted  3.081473
# 12      2  Predicted  3.211041
# 13      3  Predicted  2.951905
# 14      4  Predicted  3.211041
# 15      5  Predicted  2.838533
# 16      6  Predicted  3.194845
# 17      7  Predicted  3.000493
# 18      8  Predicted  3.016689
# 19      9  Predicted  3.032885

sns.barplot(data=df_melted, x='index', y='value', hue='variable')

[out]

enter image description here

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