【问题标题】:How to plot stacked event duration (Gantt Charts) using Python Pandas如何使用 Python Pandas 绘制堆叠事件持续时间(甘特图)
【发布时间】:2015-10-27 12:35:56
【问题描述】:

我有一个 Pandas 数据框,其中包含流量计开始测量流量的日期和车站退役的日期。我想生成一个以图形方式显示这些日期的图。这是我的 DataFrame 的示例:

import pandas as pd

data = {'index': [40623, 40637, 40666, 40697, 40728, 40735, 40742, 40773, 40796, 40819, 40823, 40845, 40867, 40887, 40945, 40964, 40990, 41040, 41091, 41100], 'StationId': ['UTAHDWQ-5932100', 'UTAHDWQ-5932230', 'UTAHDWQ-5932240', 'UTAHDWQ-5932250', 'UTAHDWQ-5932253', 'UTAHDWQ-5932254', 'UTAHDWQ-5932280', 'UTAHDWQ-5932290', 'UTAHDWQ-5932750', 'UTAHDWQ-5983753', 'UTAHDWQ-5983754', 'UTAHDWQ-5983755', 'UTAHDWQ-5983756', 'UTAHDWQ-5983757', 'UTAHDWQ-5983759', 'UTAHDWQ-5983760', 'UTAHDWQ-5983775', 'UTAHDWQ-5989066', 'UTAHDWQ-5996780', 'UTAHDWQ-5996800'], 'amin': ['1994-07-19 13:15:00', '2006-03-16 13:55:00', '1980-10-31 16:00:00', '1981-06-11 17:45:00', '2006-06-28 13:15:00', '2006-06-28 13:55:00', '1981-06-11 15:30:00', '1992-06-10 15:45:00', '2005-10-03 16:30:00', '2006-04-25 09:56:00', '2006-04-25 11:05:00', '2006-04-25 13:50:00', '2006-04-25 14:20:00', '2006-04-25 12:45:00', '2008-04-08 13:03:00', '2008-04-08 13:15:00', '2008-04-15 12:47:00', '2005-10-04 10:15:00', '1995-03-09 13:59:00', '1995-03-09 15:13:00'], 'amax': ['1998-06-30 14:51:00', '2007-01-24 12:55:00', '2007-07-31 11:35:00', '1990-08-01 08:30:00', '2007-01-24 13:35:00', '2007-01-24 14:05:00', '2006-08-22 16:00:00', '1998-06-30 11:33:00', '2005-10-22 15:00:00', '2006-04-25 10:00:00', '2008-04-08 12:16:00', '2008-04-08 09:10:00', '2008-04-08 09:30:00', '2008-04-08 11:27:00', '2008-04-08 13:05:00', '2008-04-08 13:23:00', '2009-04-07 13:15:00', '2005-10-05 11:40:00', '1996-03-14 10:40:00', '1996-03-14 11:05:00']}
df = pd.DataFrame(data)
df.set_index('index', inplace=True)

# display(df.head())

             StationId                 amin                 amax
index                                                           
40623  UTAHDWQ-5932100  1994-07-19 13:15:00  1998-06-30 14:51:00
40637  UTAHDWQ-5932230  2006-03-16 13:55:00  2007-01-24 12:55:00
40666  UTAHDWQ-5932240  1980-10-31 16:00:00  2007-07-31 11:35:00
40697  UTAHDWQ-5932250  1981-06-11 17:45:00  1990-08-01 08:30:00
40728  UTAHDWQ-5932253  2006-06-28 13:15:00  2007-01-24 13:35:00

我想创建一个与此类似的图(请注意,我没有使用上述数据制作此图):

绘图不必沿每条线显示文本,只需显示带有站点名称的 y 轴。

虽然这看起来像是 pandas 的小众应用,但我知道有几位科学家会从这种绘图能力中受益。

我能找到的最接近的答案在这里:

最后一个答案最符合我的需要。

虽然我更喜欢通过 Pandas 包装器实现此目的的方法,但我会开放并感谢直接的 matplotlib 解决方案。

【问题讨论】:

    标签: python pandas matplotlib time-series line-plot


    【解决方案1】:
    • 我认为您正在尝试创建甘特图。
    • This 建议使用hlines
    • matplotlib 3.4.2 中测试
    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib.dates as dt
    
    # using df from the OP
    
    # convert columns to a datetime dtype
    df.amin = pd.to_datetime(df.amin)
    df.amax = pd.to_datetime(df.amax)
    
    fig, ax = plt.subplots(figsize=(8, 5))
    ax = ax.xaxis_date()
    ax = plt.hlines(df.index, dt.date2num(df.amin), dt.date2num(df.amax))
    

    • 以下代码也可以使用
    # using df from the OP
    
    df.amin = pd.to_datetime(df.amin)
    df.amax = pd.to_datetime(df.amax)
    
    fig, ax = plt.subplots(figsize=(8, 5))
    ax = plt.hlines(df.index, df.amin, df.amax)
    

    【讨论】:

      【解决方案2】:

      您可以使用 Bokeh(python 库)制作甘特图,它真的很漂亮。 这是我从推特上复制的代码。 http://nbviewer.jupyter.org/gist/quebbs/10416d9fb954020688f2

      from bokeh.plotting import figure, show, output_notebook, output_file
      from bokeh.models import ColumnDataSource, Range1d
      from bokeh.models.tools import HoverTool
      from datetime import datetime
      from bokeh.charts import Bar
      output_notebook()
      #output_file('GanntChart.html') #use this to create a standalone html file to send to others
      import pandas as ps
      
      DF=ps.DataFrame(columns=['Item','Start','End','Color'])
      Items=[
          ['Contract Review & Award','2015-7-22','2015-8-7','red'],
          ['Submit SOW','2015-8-10','2015-8-14','gray'],
          ['Initial Field Study','2015-8-17','2015-8-21','gray'],
          ['Topographic Procesing','2015-9-1','2016-6-1','gray'],
          ['Init. Hydrodynamic Modeling','2016-1-2','2016-3-15','gray'],
          ['Prepare Suitability Curves','2016-2-1','2016-3-1','gray'],
          ['Improvement Conceptual Designs','2016-5-1','2016-6-1','gray'],
          ['Retrieve Water Level Data','2016-8-15','2016-9-15','gray'],
          ['Finalize Hydrodynamic Models','2016-9-15','2016-10-15','gray'],
          ['Determine Passability','2016-9-15','2016-10-1','gray'],
          ['Finalize Improvement Concepts','2016-10-1','2016-10-31','gray'],
          ['Stakeholder Meeting','2016-10-20','2016-10-21','blue'],
          ['Completion of Project','2016-11-1','2016-11-30','red']
          ] #first items on bottom
      
      for i,Dat in enumerate(Items[::-1]):
          DF.loc[i]=Dat
      
      #convert strings to datetime fields:
      DF['Start_dt']=ps.to_datetime(DF.Start)
      DF['End_dt']=ps.to_datetime(DF.End)
      
      
      G=figure(title='Project Schedule',x_axis_type='datetime',width=800,height=400,y_range=DF.Item.tolist(),
              x_range=Range1d(DF.Start_dt.min(),DF.End_dt.max()), tools='save')
      
      hover=HoverTool(tooltips="Task: @Item<br>\
      Start: @Start<br>\
      End: @End")
      G.add_tools(hover)
      
      DF['ID']=DF.index+0.8
      DF['ID1']=DF.index+1.2
      CDS=ColumnDataSource(DF)
      G.quad(left='Start_dt', right='End_dt', bottom='ID', top='ID1',source=CDS,color="Color")
      #G.rect(,"Item",source=CDS)
      show(G)
      

      【讨论】:

      • 模块bokeh.charts 不再受支持。我正在寻找替换它的方法。
      • @srodriguex 我有一个类似的问题,试图在散景堆积条形图中绘制相邻事件,如果您找到更新的 sn-p,请告诉我
      【解决方案3】:

      单杠也可以做到这一点:broken_barh(xranges, yrange, **kwargs)

      【讨论】:

        【解决方案4】:

        虽然我不知道在 MatplotLib 中有什么方法可以做到这一点,但您可能想看看使用 D3 以您想要的方式可视化数据的选项,例如,使用这个库:

        https://github.com/jiahuang/d3-timeline

        如果你必须用 Matplotlib 来做,这里有一种方法:

        Matplotlib timelines

        【讨论】:

          猜你喜欢
          • 2019-09-19
          • 1970-01-01
          • 2014-01-14
          • 2016-08-15
          • 2019-02-12
          • 1970-01-01
          • 2023-04-05
          • 2019-07-21
          相关资源
          最近更新 更多