【问题标题】:How to individually label bars in Matplotlib plot?如何在 Matplotlib 图中单独标记条形?
【发布时间】:2020-11-28 03:18:14
【问题描述】:

有没有办法使用 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】:

    您可以像创建矩形一样使用ax.text()

    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 start, end, cat in data:
        v = [(mdates.date2num(start), cats[cat] - .4),
             (mdates.date2num(start), cats[cat] + .4),
             (mdates.date2num(end), cats[cat] + .4),
             (mdates.date2num(end), cats[cat] - .4),
             (mdates.date2num(start), cats[cat] - .4)]
        verts.append(v)
        colors.append(colormapping[cat])
    
    bars = PolyCollection(verts, facecolors=colors)
    
    fig, ax = plt.subplots()
    ax.add_collection(bars)
    
    for start, end, cat in data:
        ax.text((mdates.date2num(start) + mdates.date2num(end)) / 2, cats[cat], cat,
                color='lightgoldenrodyellow', fontsize=15, ha='center', va='center')
    
    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()
    

    【讨论】:

      猜你喜欢
      • 2011-01-11
      • 2016-02-25
      • 2020-02-10
      • 2020-07-25
      • 2019-05-07
      • 2017-11-09
      • 2023-04-01
      • 1970-01-01
      • 2013-03-03
      相关资源
      最近更新 更多