根据知乎大神自己总结的分组画箱线图的方式

419 阅读2分钟

因为某些需求,需要完成一个分组画箱线图的功能,在知乎上看到了一个大神的回答 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()

运行结果:

image.png

参考了知乎大神的解法 Python 可视化:分组箱线图,如有侵权,马上删除。