Графики участков двух колонн рядом в морском заливе - PullRequest
0 голосов
/ 18 сентября 2018

Я хотел бы построить два столбца данных в пандах как боксы бокса по категориям.Это не то же самое, что и вопрос, представленный здесь: Сгруппированный коробочный график с seaborn , где в двух столбцах есть списки.Решение там не работает для меня.

MWE

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame(
[
[2, 4, "A"],
[4, 5, "C"],
[5, 4, "B"],
[10, 4.2, "A"],
[9, 3, "B"],
[3, 3, "C"]
], columns=['data1', 'data2', 'Categories'])

#Plotting by seaborn
fig, axs = plt.subplots(1, 1)
sns.boxplot(data=df,x="Categories",y='data1',ax=axs)
fig.show()
plt.waitforbuttonpress()
plt.close(fig)

Приведенный выше код создает: enter image description here

Замена "data1 "с" data2 "в строке boxplot даст: enter image description here

То, что я хочу, выглядит примерно так: enter image description here

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Попробуйте:

df = pd.DataFrame(
[
[2, 4, "A"],
[4, 5, "C"],
[5, 4, "B"],

[10, 4.2, "A"],
[9, 3, "B"],
[3, 3, "C"]
], columns=['data1', 'data2', 'Categories'])

#Plotting by seaborn
df_c = pd.melt(df, "Categories", var_name="data1", value_name="data2")
sns.factorplot("Categories",hue="data1", y="data2", data=df_c, kind="box")
0 голосов
/ 18 сентября 2018

Вам нужно melt (преобразовать в длинный формат) сначала DataFrame:

data = df.melt(id_vars=['Categories'], var_name='dataset', value_name='values')
print(data)

Отпечатки:

   Categories dataset  values
0           A   data1     2.0
1           A   data2     4.0
2           C   data1     4.0
3           C   data2     5.0
4           B   data1     5.0
5           B   data2     4.0
6           A   data1    10.0
7           A   data2     4.2
8           B   data1     9.0
9           B   data2     3.0
10          C   data1     3.0
11          C   data2     3.0

Теперь вам просто нужно использовать datasetкак оттенокПоскольку сюжет довольно занят, я переместил легенду за его пределы.

sns.boxplot(data=data, x='Categories', y='values', hue='dataset')
plt.legend(title='dataset', loc='upper left', bbox_to_anchor=(1, 1))

enter image description here

Редактировать с помощью OP :

Я реализовал это в функции, так что она делает график с таким количеством столбцов, сколько нужно в топоре, и возвращает его.

def box_plot_columns(df,categories_column,list_of_columns,legend_title,y_axis_title,**boxplotkwargs):
    columns = [categories_column] + list_of_columns
    newdf = df[columns].copy()
    data = newdf.melt(id_vars=[categories_column], var_name=legend_title, value_name=y_axis_title)
    return sns.boxplot(data=data, x=categories_column, y=y_axis_title, hue=legend_title, **boxplotkwargs)

Пример использования:

fig, ax = plt.subplots(1,1)
ax = box_plot_columns(Data,"Categories",["data1","data2"],"dataset","values",ax=ax)
ax.set_title("My Plot")
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...