python - 在seaborn中并排绘制两列的箱形图
问题描述
我想按类别将熊猫数据框的两列并排绘制为箱形图。这与此处提出的问题不同:Grouped boxplot with 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)
解决方案
您需要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))
由 OP 编辑:
我在一个函数中实现了这一点,它使绘图在 ax 中具有任意多的列并返回它。
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()
推荐阅读
- biztalk - BizTalk 2013R2 - 模糊转换失败错误
- php - 将购物车页面(运费计算器)中的邮政编码字段更改为下拉菜单
- listview - 在 bloc flutter 中单击列表视图时如何获取列表视图 ID?
- java - 为什么不能在 java 中直接创建函数数组?
- vb.net - 如何将动态创建的类型传递给函数?
- swift - 如何将java字节转换为swift int
- java - 如何将java应用程序表单oracle jdk迁移到openjdk?
- angular - 测试可观察
在 ngRx 中使用 Jest - java - 从 POST 方法调用 PUT 是个好主意吗
- sql - 在 Oracle SQL SELECT 语句中加入条件