基于列名的 Seaborn 多分组箱线图

时间:2021-06-18 00:32:11

标签: pandas seaborn boxplot

假设我有以下数据框

df = pd.DataFrame(
[
['x', 42, 50 68 12,
['y', 51, 60 79 22,
['z', 43, 50 58 12,
['w', 46, 70 88 22,
['xy',38, 40 69 22,
['xz',39, 40 49 12
], columns=['system', 'b', 'c', 'd', 'e'])

我想根据列名创建一个多分组的箱线图(我想创建 b、c、d、e 和列的箱线图)。有没有办法完成这个任务?我找不到有关此的任何信息

例如,我查看了 seaborn 网站,它根据列值 here (hue="smoker")

创建了分组箱线图

1 个答案:

答案 0 :(得分:0)

您需要先melt您的数据框才能将其数据结构更改为适用于 seaborn 的结构:

注意:下面的代码不会返回示例数据上的框。但是,它应该适用于实际数据。使用提供的示例数据,如果您传递 hue 参数,您将不会得到一个框,因为 system 列中值的最大大小为 1。您不能有一个带有只有一个值,这将违背箱线图的目的。相反,您可能需要一个条形图或折线图。 换句话说,您只有一行表示 x、y、z、w、xy、xz 等。在您的实际数据中,假设您有 600 行系统中每个值有 100 行,那么你会得到一个带有以下代码的分组框。

import seaborn as sns
import matplotlib.pyplot as plt

df = pd.DataFrame([
['x', 42, 50, 68, 12],
['y', 51, 60, 79, 22],
['z', 43, 50, 58, 12],
['w', 46, 70, 88, 22],
['xy',38, 40, 69, 22],
['xz',39, 40, 49, 12]], columns=['system', 'b', 'c', 'd', 'e'])

df = df.melt(id_vars='system')

sns.boxplot(x="system", y="value", hue="variable", data=df)