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

不能在单个图中的多个小提琴图中迭代“cbar”或“cmins”

  •  0
  • Redshoe  · 技术社区  · 1 年前

    我试图在单个情节中的多个情节中改变每个小提琴情节的颜色。我可以改变颜色 身体 ,但我不能改变颜色 厘巴 , cmins , cmaxes 我该怎么做?

    import matplotlib.pyplot as plt
    
    mock_data= [
               [0,1,2,3,4,5,6,7,8,9],
               [1,2,3,4,5,6,7,8,9,10],
               [2,3,4,5,6,7,8,9,10,11],
               [3,4,5,6,7,8,9,10,11,12],
               [4,5,6,7,8,9,10,11,12,13],
               [5,6,7,8,9,10,11,12,13,14],
               [6,7,8,9,10,11,12,13,14,15],
               [7,8,9,10,11,12,13,14,15,16],
               [8,9,10,11,12,13,14,15,16,17],
               [9,10,11,12,13,14,15,16,17,18],
               ]
    pos      = [0,1,2,3,4,5,6,7,8,9]
    colors   = ["C0","C1","C2","C3","C4","C5","C6","C7","C8","C9"]
    fig, ax  = plt.subplots(1,1)
    
    violin   = ax.violinplot(mock_data,positions=pos)
    
    for things in ["bodies","cbars","cmins","cmaxes"]:
       for vp, co in zip(violin[things],colors):
          vp.set_facecolor(co)
          vp.set_edgecolor(co)
    
    
    plt.show()
    

    使用上述代码,我得到以下错误

    Traceback (most recent call last):
      File "/downloads/violin.py", line 25, in <module>
        for vp, co in zip(violin[things],colors):
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^
    TypeError: 'LineCollection' object is not iterable
    
    

    似乎只有 violin["bodies"] 是可迭代的,但是 violin["cbars"] , violin["cmins"] , violin["cmaxes"] 没有。鉴于此,我如何有效地更改平均值、分钟和最大值的线条颜色?

    1 回复  |  直到 1 年前
        1
  •  0
  •   Timeless    1 年前

    这很正常,因为只有 "bodies" 可迭代的 正如你已经注意到的。

    {
        'bodies': [
            <matplotlib.collections.PolyCollection at 0x15fd0781df0>,
            ...
            <matplotlib.collections.PolyCollection at 0x15fd0a3fa70>
        ],
        'cmaxes': <matplotlib.collections.LineCollection at 0x15fd071f710>,
        'cmins':  <matplotlib.collections.LineCollection at 0x15fd0a68d10>,
        'cbars':  <matplotlib.collections.LineCollection at 0x15fd0781430>
    }
    

    一种可能的解决方案是分别处理每个组件:

    for comp, coll in violin.items():
        if comp == "bodies":
            for pc, co in zip(coll, colors):
                pc.set_facecolor(co)
                pc.set_edgecolor(co)
        else:
            coll.set_color(colors)
    

    enter image description here