Вам нужно 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](https://i.stack.imgur.com/QCU8C.png)
Редактировать с помощью 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()