因为某些需求,需要完成一个分组画箱线图的功能,在知乎上看到了一个大神的回答 Python 可视化:分组箱线图,然后自己也总结了一下,将代码以更加简单的方式整理了一下。
import matplotlib.pyplot as plt
import numpy as np
if __name__ == "__main__":
# 生成示例数据
box_width = 0.5
marker_size = 5
row_width = 0.6
colors = ['C0', 'C1', 'C2', 'C3', 'C4']
# 其中 y 的值都是二维数组
y1 = [[1, 2, 3, 4, 5] for i in range(1, 6)]
y2 = [[1, 2, 3, 4, 5] for i in range(1, 6)]
y3 = [[1, 2, 3, 4, 5] for i in range(1, 6)]
y4 = [[1, 2, 3, 4, 5] for i in range(1, 6)]
# 这里是规定 每一个箱子应该在的位置
x1 = np.array([1, 4, 7, 10, 13])
x2 = x1 + row_width
x3 = x2 + row_width
x4 = x3 + row_width
# 绘制分组箱线图
box1 = plt.boxplot(y1, positions=x1, patch_artist=True, showmeans=True,
boxprops={"facecolor": colors[0],
"edgecolor": "grey",
"linewidth": box_width},
medianprops={"color": "k", "linewidth": 0.5},
meanprops={'marker': '+',
'markerfacecolor': 'k',
'markeredgecolor': 'k',
'markersize': marker_size}
)
box2 = plt.boxplot(y2, positions=x2, patch_artist=True, showmeans=True,
boxprops={"facecolor": colors[1],
"edgecolor": "grey",
"linewidth": box_width},
medianprops={"color": "k", "linewidth": 0.5},
meanprops={'marker': '+',
'markerfacecolor': 'k',
'markeredgecolor': 'k',
'markersize': marker_size})
box3 = plt.boxplot(y3, positions=x3, patch_artist=True, showmeans=True,
boxprops={"facecolor": colors[2],
"edgecolor": "grey",
"linewidth": box_width},
medianprops={"color": "k", "linewidth": 0.5},
meanprops={'marker': '+',
'markerfacecolor': 'k',
'markeredgecolor': 'k',
'markersize': marker_size}
)
box4 = plt.boxplot(y4, positions=x4, patch_artist=True, showmeans=True,
boxprops={"facecolor": colors[3],
"edgecolor": "grey",
"linewidth": box_width},
medianprops={"color": "k", "linewidth": 0.5},
meanprops={'marker': '+',
'markerfacecolor': 'k',
'markeredgecolor': 'k',
'markersize': marker_size}
)
city = ["A", "B", "C", "D", "E"]
plt.xticks([2, 5, 8, 11, 14], city, fontsize=11)
plt.ylim(0, 10)
plt.ylabel('test-y', fontsize=11)
plt.grid(axis='y', ls='--', alpha=0.8)
# 给箱体添加图例,每类箱线图中取第一个颜色块用于代表图例
plt.legend(handles=[box1['boxes'][0], box2['boxes'][0], box3['boxes'][0], box4['boxes'][0]], labels=['a', 'b', 'c', 'd'])
plt.tight_layout()
plt.show()
运行结果:
参考了知乎大神的解法 Python 可视化:分组箱线图,如有侵权,马上删除。