代码之家  ›  专栏  ›  技术社区  ›  mbadd

将图例添加到matplotlib箱线图中,在同一轴上有多个图

  •  26
  • mbadd  · 技术社区  · 7 年前

    我用matplotlib生成了一个箱线图:

    enter image description here

    然而,我不知道如何产生传说。每当我尝试以下操作时,都会出现一个错误,即 Legend does not support {boxes: ... 我已经做了相当多的搜索,似乎没有一个例子显示如何实现这一点。任何帮助都将不胜感激!

    bp1 = ax.boxplot(data1, positions=[1,4], notch=True, widths=0.35, patch_artist=True)
    bp2 = ax.boxplot(data2, positions=[2,5], notch=True, widths=0.35, patch_artist=True)
    
    ax.legend([bp1, bp2], ['A', 'B'], loc='upper right')
    
    2 回复  |  直到 7 年前
        1
  •  41
  •   Community miroxlav    4 年前

    这个 boxplot 返回艺术家词典

    结果:dict
    将箱线图的每个组件映射到matplotlib列表的字典。线已创建Line2D实例。该字典具有以下键(假设垂直箱线图):

    • boxes :箱线图的主体,显示四分位数和中值置信区间(如果启用)。
    • [...]

    使用 ,您可以通过以下方式获得传奇艺术家:

    ax.legend([bp1["boxes"][0], bp2["boxes"][0]], ['A', 'B'], loc='upper right')
    

    完整示例:

    import matplotlib.pyplot as plt
    import numpy as np; np.random.seed(1)
    
    data1=np.random.randn(40,2)
    data2=np.random.randn(30,2)
    
    fig, ax = plt.subplots()
    bp1 = ax.boxplot(data1, positions=[1,4], notch=True, widths=0.35, 
                     patch_artist=True, boxprops=dict(facecolor="C0"))
    bp2 = ax.boxplot(data2, positions=[2,5], notch=True, widths=0.35, 
                     patch_artist=True, boxprops=dict(facecolor="C2"))
    
    ax.legend([bp1["boxes"][0], bp2["boxes"][0]], ['A', 'B'], loc='upper right')
    
    ax.set_xlim(0,6)
    plt.show()
    

    enter image description here

        2
  •  2
  •   Sayyor Y    4 年前

    作为@ImportanceOfBeingErnest响应的补充,如果您在这样的for循环中绘图:

    for data in datas:
        ax.boxplot(data, positions=[1,4], notch=True, widths=0.35, 
                 patch_artist=True, boxprops=dict(facecolor="C0"))
    

    不能将绘图保存为变量。在这种情况下,创建图例标签列表 legends ,将绘图追加到另一个列表中 elements 并使用列表理解为每一项添加图例:

    labels = ['A', 'B']
    colors = ['blue', 'red']
    elements = []
    
    for dIdx, data in enumerate(datas):
        elements.append(ax.boxplot(data, positions=[1,4], notch=True,\
        widths=0.35, patch_artist=True, boxprops=dict(facecolor=colors[dIdx])))
    
    ax.legend([element["boxes"][0] for element in elements], 
        [labels[idx] for idx,_ in enumerate(datas)])