如何在 Matplotlib 图中单独标记条形图? [英] How to individually label bars in Matplotlib plot?

查看:66
本文介绍了如何在 Matplotlib 图中单独标记条形图?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法使用 Matplotlib 标记单个条形?

 将日期时间导入为dt导入matplotlib.pyplot作为plt导入 matplotlib.dates 作为 mdates从matplotlib.collections导入PolyCollection数据= [(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), '吃'),(dt.datetime(2018, 7, 17, 0, 45), dt.datetime(2018, 7, 17, 1, 0), '工作'),(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), '吃'),(dt.datetime(2018, 7, 17, 1, 30), dt.datetime(2018, 7, 17, 1, 45), '工作')]猫= {睡眠"1:吃";:2,工作":3}colormapping = {"sleep":"CO",吃";:C1",工作";:C2"}verts = []颜色 = []对于数据中的 d: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]), 猫[d[2]]-.4)]verts.append(v)颜色.附加(颜色映射[d[2]])条 = PolyCollection(verts, facecolors=colors)无花果,ax = plt.subplots()ax.add_collection(条形)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([睡眠",吃",工作"])plt.show()

解决方案

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

 将日期时间导入为dt导入matplotlib.pyplot作为plt导入 matplotlib.dates 作为 mdates从matplotlib.collections导入PolyCollection数据= [[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), '工作'),(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), '吃'),(dt.datetime(2018,7,17,1,30),dt.datetime(2018,7,17,1,45),'work')]猫 = {睡眠":1,吃":2,工作":3}颜色映射 = {睡眠":C0",吃":C1",工作":C2"}verts = []颜色 = []用于开始,结束,输入数据: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)颜色.附加(颜色映射[猫])条= PolyCollection(verts,facecolors = colors)无花果,ax = plt.subplots()ax.add_collection(栏)用于开始,结束,输入数据: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()

Is there a way to label individual bars using Matplotlib? The nice example of a collection of horizontal bars is mosty what I need, however I need to add labels to each bar. E.g. label the green bar green, orange bar orange, etc. How would I modify the code below to accomplish this task?

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()

解决方案

You can use ax.text() in a similar way as you created the rectangles:

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()

这篇关于如何在 Matplotlib 图中单独标记条形图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆