【问题标题】:How to draw a bar timeline with matplotlib?如何使用 matplotlib 绘制条形时间线?
【发布时间】:2017-06-13 09:57:17
【问题描述】:

我有以下数据类型:

Begin   End                        Event
 2003  2007                      Event 1
 1991  2016                      Event 2
 2008  2016                      Event 3
 1986  2015                      Event 4
 2013  2013                      Event 5
 1994  1999                      Event 6
 2002  2002                      Event 7

我的目标是制作这些事件的时间线,即从日期 1 到日期 2 绘制一系列不同的直条和水平条,并在上面标明事件的名称。

我目前正在尝试使用 matplotlib 中的 barh 函数,但我想知道 python 中是否已经有一个现成的模块可以与 matplotlib 和 pandas 很好地集成来做到这一点?

【问题讨论】:

    标签: python matplotlib timeline


    【解决方案1】:

    我认为这里不需要特殊功能。使用plt.barh 直接为您提供所需的情节。

    import matplotlib.pyplot as plt
    import numpy as np
    
    begin = np.array([2003,1991,2008,1986,2013,1994,2002])
    end =   np.array([2007,2016,2016,2015,2013,1999,2002])
    event = ["Event {}".format(i) for i in range(len(begin))]
    
    plt.barh(range(len(begin)),  end-begin, left=begin)
    
    plt.yticks(range(len(begin)), event)
    plt.show()
    

    请注意,事件 4 和 6 似乎缺失,因为开始和结束是相同的。如果要将end解释为年末,可以加1,

    plt.barh(range(len(begin)),  end-begin+1, left=begin)
    

    【讨论】:

    • 如果有宏,参数可能会更容易,但感谢您的提示。
    • 用一行代码替换两行代码的宏?
    • 并且还添加了预设参数,使代码更具可读性和更快的编写或理解。这就是为什么我尽可能喜欢 pandas 而不是 numpy + matplotlib。
    • 上面的代码是一个命令,如果需要的话,它需要很多参数。我不太明白你想要什么。但是如果你想写一个使用一些默认参数的函数,就写那个函数。如果您在这样做时遇到问题,请提出相关问题。
    • 请注意,如果 barh (height) 的第一个参数是一个函数 F(begin, end, event) 应用于相应的三元组,则可以对事件进行分组,允许在其中包含多个事件一行,(如mathigon.org/timeline.)。当然,该函数应该只对不重叠的事件进行分组,以便正确呈现它们
    【解决方案2】:

    对输入数据进行了不同的序列化,如下所示,对于传入的数据更自然一些:

    events = [('Event 0', 2003, 2007),
         ('Event 1', 1991, 2016),
         ('Event 2', 2008, 2016)
         #...
         ]
    

    也包装在一个函数中,正如问题作者可能想要的那样。

    https://github.com/epogrebnyak/hrange/blob/master/hrange.py

    【讨论】:

      猜你喜欢
      • 2015-06-20
      • 2022-11-10
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 2022-01-20
      • 2022-08-06
      • 1970-01-01
      相关资源
      最近更新 更多