我正在尝试使用matplotlib绘制一个二进制时间线(不过,我可能会考虑其他库)。现在,我所说的“二元时间线”是指“显示按时间顺序排列的事件,其中事件空间由两个相反的事件组成”。我想要复制的表示如下(我使用d3完成了它):
我尝试过使用堆叠的单杠,但它显然不是这项工作的正确工具。是否有更简单和/或更正确的方法来实现这一结果?
g52tjvyc1#
您可以使用broken_barh来绘制二元时间表。
broken_barh
import numpy as np import pandas as pd import matplotlib.pyplot as plt import matplotlib.dates #create a time series s with dates as index and 0 and 1 for events dates = pd.date_range("2017-04-01","2017-06-15", freq="D") events = np.random.random_integers(0,1,size=len(dates)) s = pd.Series(events, index=dates) fig, ax= plt.subplots(figsize=(6,2)) # plot green for event==1 s1 = s[s == 1] inxval = matplotlib.dates.date2num(s1.index.to_pydatetime()) times= zip(inxval, np.ones(len(s1))) plt.broken_barh(times, (-1,1), color="green") # plot red for event==0 s2 = s[s == 0] inxval = matplotlib.dates.date2num(s2.index.to_pydatetime()) times= zip(inxval, np.ones(len(s2))) plt.broken_barh(times, (-1,1), color="red") #format axes ax.margins(0) ax.set_yticks([]) ax.xaxis.set_major_locator(matplotlib.dates.MonthLocator()) ax.xaxis.set_minor_locator(matplotlib.dates.DayLocator()) monthFmt = matplotlib.dates.DateFormatter("%b") ax.xaxis.set_major_formatter(monthFmt) plt.tight_layout() plt.show()
9jyewag02#
这可能对您有用:Rich Matplotlib timeline visualization它确实显示了比您可能需要的更丰富的信息。
nom7f22z3#
为了摆脱ImportanceOfBeingErnest的解决方案,我不得不将时间硬编码到列表中,因为zip对象是一个迭代器,会抛出错误。例如plt.broken_barh(list(times), (-1,1), color="green")
plt.broken_barh(list(times), (-1,1), color="green")
3条答案
按热度按时间g52tjvyc1#
您可以使用
broken_barh
来绘制二元时间表。9jyewag02#
这可能对您有用:
Rich Matplotlib timeline visualization
它确实显示了比您可能需要的更丰富的信息。
nom7f22z3#
为了摆脱ImportanceOfBeingErnest的解决方案,我不得不将时间硬编码到列表中,因为zip对象是一个迭代器,会抛出错误。
例如
plt.broken_barh(list(times), (-1,1), color="green")