【问题标题】:Stacked horizontal bar showing datetime areas显示日期时间区域的堆叠水平条
【发布时间】:2021-11-28 09:30:41
【问题描述】:

我正在尝试使用 matplotlib 和 pandas 在 python 中创建一个带有堆叠日期时间的水平条形图。它应该代表一个时间线,机器何时可用(绿色)和何时不可用(红色)。最后应该是这样的:

我不确定是否使用 barh 或者是否有更简单的解决方案。

我的方法是这样的,但我得到了TypeError: invalid type promotion

import datetime
import matplotlib.dates as mdates

time = datetime.datetime.now()
data = [[time,time+datetime.timedelta(0,5),time+datetime.timedelta(0,10)]]
#data_num = [[1,2,3]]
df2 = pd.DataFrame(data)
df2.plot.barh(stacked=True);

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    我认为您不能为此使用堆叠的条形图。一种方法是制作一个非常粗的线图。理想情况下,您应该有一个日期框,指示它关闭或打开的时间间隔:

    import datetime
    import pandas as pd
    import matplotlib.pyplot as plt
    
    time = datetime.datetime.now()
    date_from = [time,time+datetime.timedelta(0,30),
                 time+datetime.timedelta(0,50)]
    date_to = date_from[1:] + [time+datetime.timedelta(0,100)]
    df = pd.DataFrame({'date_from':date_from,'date_to':date_to,
    'status':[0,1,0]})
    df
    
        date_from   date_to status
    0   2021-11-28 12:30:39.428099  2021-11-28 12:31:09.428099  0
    1   2021-11-28 12:31:09.428099  2021-11-28 12:31:29.428099  1
    2   2021-11-28 12:31:29.428099  2021-11-28 12:32:19.428099  0
    

    然后遍历行并绘制:

    cols = ['#DADDFC','#FC997C']
    fig,ax = plt.subplots(figsize = (8,3))
    for i in range(df.shape[0]):
        ax.plot([df['date_from'][i],df['date_to'][i]],[1,1],
                linewidth=50,c=cols[df['status'][i]])
    ax.set_yticks([])
    ax.set_yticklabels([])
    ax.set(frame_on=False)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-11
      • 2021-05-23
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多