使用 matplotlib 和 PolyCollection 的时间轴栏 - Python

Timeline bar using matplotlib & PolyCollection - Python

我一直在尝试复制@theimportanceofbeingernest 对 的回答 并且似乎无法获得正确的输出图。

Here is my current output

Here is my desired output(但使用我的数据等)

我正在努力找出问题所在。 任何帮助将不胜感激! 谢谢。

代码如下:

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

data = [(dt.datetime(1900, 1, 1, 14, 19, 26), dt.datetime(1900, 1, 1, 14, 19, 29), 'index'),
        (dt.datetime(1900, 1, 1, 14, 19, 29), dt.datetime(1900, 1, 1, 14, 19, 31), 'links'),
        (dt.datetime(1900, 1, 1, 14, 19, 31), dt.datetime(1900, 1, 1, 14, 19, 33), 'guides'),
        (dt.datetime(1900, 1, 1, 14, 19, 33), dt.datetime(1900, 1, 1, 14, 19, 35), 'prices'),
        (dt.datetime(1900, 1, 1, 14, 19, 35), dt.datetime(1900, 1, 1, 16, 39, 47), 'index'),
        (dt.datetime(1900, 1, 1, 16, 39, 47), dt.datetime(1900, 1, 1, 16, 39, 48), 'prices')]

cats = {'index': 1, 'links': 2, 'guides': 3, 'prices': 4}
colormapping  = {'index': 'C0', 'links': 'C1', 'guides': 'C2', 'prices': 'C3'} 

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,30])
ax.xaxis.set_major_locator(loc)
ax.xaxis.set_major_formatter(mdates.AutoDateFormatter(loc))

ax.set_yticks([1,2,3,4])
ax.set_yticklabels(['index', 'links', 'guides', 'prices'])
plt.show()

你们的时差极短。它们是几秒钟,而您的 x 范围是几个小时。所以,这些酒吧基本上是看不见的。

请注意,在 matplotlib 中,区域通常是在没有抗锯齿的情况下绘制的,这在将多个半透明区域放在一起时很有用。然而,线条以一定的粗细(在屏幕空间中)绘制并进行了抗锯齿处理。因此,设置一个明确的边缘颜色有助于可视化这些 "bars".

bars = PolyCollection(verts, facecolors=colors, edgecolors=colors)