Python 中的箱线图

Boxplot in Python

我正在尝试为以下数据绘制箱线图,我以这种格式提供数据,以便让您了解我正在尝试做什么,但实际上只有 RHS 部分存在在 Data.txt 文件中

A1 -- 1
A1 -- 2
A1 -- 3
A1 -- 4
A1 -- 5
B1 -- 10
B1 -- 11
B1 -- 12
B1 -- 13
B1 -- 14
C1 -- 20
C1 -- 21
C1 -- 22
C1 -- 23
C1 -- 24
A5 -- 1
A5 -- 2
A5 -- 3
A5 -- 4
A5 -- 5
B5 -- 10
B5 -- 11
B5 -- 12
B5 -- 13
B5 -- 14
C5 -- 20
C5 -- 21
C5 -- 22
C5 -- 23
C5 -- 24
A10 -- 1
A10 -- 2
A10 -- 3
A10 -- 4
A10 -- 5
B10 -- 10
B10 -- 11
B10 -- 12
B10 -- 13
B10 -- 14
C10 -- 20
C10 -- 21
C10 -- 22
C10 -- 23
C10 -- 24

但数据实际上会像这样出现在 Data.txt 文件中

 1
 2
 3
 4
 5
 10
 11
 12
 13
 14
 20
 21
 22
 23
 24
 1
 2
 3
 4
 5
 10
 11
 12
 13
 14
 20
 21
 22
 23
 24
 1
 2
 3
 4
 5
 10
 11
 12
 13
 14
 20
 21
 22
 23
 24

现在我想做的是,我想绘制一个 A B C 的箱线图,像这样

但我无法弄清楚如何在 Python 中这样做,因为我只是初学者并且使用 C++ 进行编码。如果有人能帮助我,我将不胜感激。谢谢。

如果您可以使用 seaborn 和 pandas,并且文件始终具有相同的结构,则可以在为 A-B-C1-5-10 创建两列后绘制文件:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

df = pd.read_csv("test.txt", header=None, names=["val"])
df["cat"] = np.tile(np.repeat(["A", "B", "C"], 5), 3)
df["num1_5_10"] = np.repeat([1, 5, 10], 15)

sns.boxplot(data=df, x="num1_5_10", y="val", hue="cat", dodge=False)

plt.show()

示例输出:

如果你想要连接线,那就多一根线;然而,seaborn 为此点图创建了重复的图例条目。所以,如果你想保留图例,我们必须手动删除重复项:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

df = pd.read_csv("test.txt", header=None, names=["val"])
df["cat"] = np.tile(np.repeat(["A", "B", "C"], 5), 3)
df["num1_5_10"] = np.repeat([1, 5, 10], 15)

ax = sns.boxplot(data=df, x="num1_5_10", y="val", hue="cat", zorder=0.9, dodge=False)
#add the lines connecting the median values
sns.pointplot(data=df, x="num1_5_10", y="val", hue="cat", estimator=np.median, ci=None, markers="None", ax=ax)

#remove duplicate entries, setting the legend outside the graph, new title
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles[:3], labels[:3], bbox_to_anchor=(1, 1), title="C++ for the win")
plt.tight_layout()
plt.show()

示例输出:

奇怪的是,seaborn 不遵守绘图的顺序,因此我们必须操纵前面箱线图中的 zorder 才能获得正确的图形元素顺序。