【问题标题】:How do I add a legend to a Matplotlib PolyCollection?如何向 Matplotlib PolyCollection 添加图例?
【发布时间】:2020-11-30 16:27:31
【问题描述】:

有没有办法向 Matplotlib 多集合添加图例?我已经根据一个很好的示例 of a collection of horizontal bars 编写了一些代码,这主要是我需要的,但是我需要为每种颜色添加一个图例。例如。将绿色条标记为绿色、橙色条为橙色等。我将如何修改下面的代码来完成此任务?

import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from matplotlib.collections import PolyCollection

data = [    (dt.datetime(2018, 7, 17, 0, 15), dt.datetime(2018, 7, 17, 0, 30), 'sleep'),
            (dt.datetime(2018, 7, 17, 0, 30), dt.datetime(2018, 7, 17, 0, 45), 'eat'),
            (dt.datetime(2018, 7, 17, 0, 45), dt.datetime(2018, 7, 17, 1, 0), 'work'),
            (dt.datetime(2018, 7, 17, 1, 0), dt.datetime(2018, 7, 17, 1, 30), 'sleep'),
            (dt.datetime(2018, 7, 17, 1, 15), dt.datetime(2018, 7, 17, 1, 30), 'eat'), 
            (dt.datetime(2018, 7, 17, 1, 30), dt.datetime(2018, 7, 17, 1, 45), 'work')
        ]

cats = {"sleep" : 1, "eat" : 2, "work" : 3}
colormapping = {"sleep" : "C0", "eat" : "C1", "work" : "C2"}

verts = []
colors = []
for d in data:
    v =  [(mdates.date2num(d[0]), cats[d[2]]-.4),
          (mdates.date2num(d[0]), cats[d[2]]+.4),
          (mdates.date2num(d[1]), cats[d[2]]+.4),
          (mdates.date2num(d[1]), cats[d[2]]-.4),
          (mdates.date2num(d[0]), cats[d[2]]-.4)]
    verts.append(v)
    colors.append(colormapping[d[2]])

bars = PolyCollection(verts, facecolors=colors)

fig, ax = plt.subplots()
ax.add_collection(bars)
ax.autoscale()
loc = mdates.MinuteLocator(byminute=[0,15,30,45])
ax.xaxis.set_major_locator(loc)
ax.xaxis.set_major_formatter(mdates.AutoDateFormatter(loc))

ax.set_yticks([1,2,3])
ax.set_yticklabels(["sleep", "eat", "work"])
plt.show()

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    为每个类别创建PolyCollection,并为每个类别分配一个标签。

    import datetime as dt
    import matplotlib.pyplot as plt
    import matplotlib.dates as mdates
    from matplotlib.collections import PolyCollection
    
    data = [    (dt.datetime(2018, 7, 17, 0, 15), dt.datetime(2018, 7, 17, 0, 30), 'sleep'),
                (dt.datetime(2018, 7, 17, 0, 30), dt.datetime(2018, 7, 17, 0, 45), 'eat'),
                (dt.datetime(2018, 7, 17, 0, 45), dt.datetime(2018, 7, 17, 1, 0),  'work'),
                (dt.datetime(2018, 7, 17, 1, 0),  dt.datetime(2018, 7, 17, 1, 30), 'sleep'),
                (dt.datetime(2018, 7, 17, 1, 15), dt.datetime(2018, 7, 17, 1, 30), 'eat'), 
                (dt.datetime(2018, 7, 17, 1, 30), dt.datetime(2018, 7, 17, 1, 45), 'work')
            ]
    
    cats = {"sleep" : 1, "eat" : 2, "work" : 3}
    colormapping = {"sleep" : "C0", "eat" : "C1", "work" : "C2"}
    
    verts = {"sleep" : [], "eat" : [], "work" : []}
    colors = {"sleep" : [], "eat" : [], "work" : []}
    for d in data:
        v =  [(mdates.date2num(d[0]), cats[d[2]]-.4),
              (mdates.date2num(d[0]), cats[d[2]]+.4),
              (mdates.date2num(d[1]), cats[d[2]]+.4),
              (mdates.date2num(d[1]), cats[d[2]]-.4),
              (mdates.date2num(d[0]), cats[d[2]]-.4)]
        verts[d[2]].append(v)
        colors[d[2]].append(colormapping[d[2]])
    
    fig, ax = plt.subplots()
    
    for cat in verts.keys():
        bars = PolyCollection(verts[cat], facecolors=colors[cat], label=cat)
        ax.add_collection(bars)
    
    ax.autoscale()
    loc = mdates.MinuteLocator(byminute=[0,15,30,45])
    ax.xaxis.set_major_locator(loc)
    ax.xaxis.set_major_formatter(mdates.AutoDateFormatter(loc))
    
    ax.set_yticks([1,2,3])
    ax.set_yticklabels(["sleep", "eat", "work"])
    
    plt.legend(loc='upper left')
    
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-13
      • 2014-10-18
      • 2020-08-18
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 2014-08-08
      • 2020-09-16
      相关资源
      最近更新 更多