Python 在seaborn中并排绘制两列的方框图
我想绘制熊猫数据帧的两列,作为按类别并排绘制的框。这与这里提出的问题不同:两列中的列表在哪里。那里的解决方案对我不起作用 MWEPython 在seaborn中并排绘制两列的方框图,python,seaborn,Python,Seaborn,我想绘制熊猫数据帧的两列,作为按类别并排绘制的框。这与这里提出的问题不同:两列中的列表在哪里。那里的解决方案对我不起作用 MWE 上面的代码生成: 将箱线图中的“data1”替换为“data2”,将给出: 我想要的是这样的东西: 首先需要熔化(转换为长格式)数据帧: data = df.melt(id_vars=['Categories'], var_name='dataset', value_name='values') print(data) 印刷品: Categories d
上面的代码生成: 将箱线图中的“data1”替换为“data2”,将给出: 我想要的是这样的东西:
首先需要
熔化(转换为长格式)数据帧
:
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))
按操作进行编辑:
我在一个函数中实现了这一点,这样它就可以在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()
试试这个:
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")
不幸的是,没有一种方法不必重新构造数据就可以做到这一点。谢谢@米格尔,毕竟有一个更简单的方法factorplot
在图例方面做得更好,但我更喜欢轴级绘图,图例可以移动。
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")