Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在matplotlib中绘制二进制时间线 我试图用MatpTLIB绘制一个二进制时间线(虽然我可以考虑其他的库)。_Python_Matplotlib_Plot_Timeline - Fatal编程技术网

Python 在matplotlib中绘制二进制时间线 我试图用MatpTLIB绘制一个二进制时间线(虽然我可以考虑其他的库)。

Python 在matplotlib中绘制二进制时间线 我试图用MatpTLIB绘制一个二进制时间线(虽然我可以考虑其他的库)。,python,matplotlib,plot,timeline,Python,Matplotlib,Plot,Timeline,现在,我所说的“二进制时间线”是指“按时间顺序显示的事件,其中事件空间由两个相反的事件组成”。 这种事件空间的一个例子可以是{u团队中没有人生病,团队中至少有一个人生病} 我想复制的表示是这样的(我使用d3实现): 我曾尝试探索堆叠水平杆的使用,但它显然不是适合这项工作的工具 是否有一种更简单和/或更正确的方法来实现该结果?您可以使用它来绘制二进制时间线 这可能对您有用: 它确实显示了比您可能需要的更丰富的信息 你能提供少量的样本数据吗?你也可以看看,它给出了一些可能的,但不是很好的解决方

现在,我所说的“二进制时间线”是指“按时间顺序显示的事件,其中事件空间由两个相反的事件组成”。 这种事件空间的一个例子可以是
{u团队中没有人生病,团队中至少有一个人生病}

我想复制的表示是这样的(我使用d3实现):

我曾尝试探索堆叠水平杆的使用,但它显然不是适合这项工作的工具

是否有一种更简单和/或更正确的方法来实现该结果?

您可以使用它来绘制二进制时间线


这可能对您有用:

它确实显示了比您可能需要的更丰富的信息


你能提供少量的样本数据吗?你也可以看看,它给出了一些可能的,但不是很好的解决方案。@jadsq最简单的例子是
[(391030.0,True),(63202.0,False),(150568.0,True)]
其中每个元组中的数字是框的宽度,第二个是二进制事件@重要的是fBeingernest使用
分散
的解决方案很整洁,但主要缺点是它显示点,因此会有空白(除非我将所有数据标准化为所有宽度的gcd,这是我想要避免的);使用PIL的解决方案也很好,但目前似乎有些过分。虽然我浏览了matplotlib的示例,但没有发现
损坏的\u barh
。谢谢你指出这一点——我相信我可以根据自己的需要调整它!如果有人必须将
timedelta64
转换为float,以绘制具有给定宽度的框(而不是像上面的示例那样使用
np.ones
),那么我所采用的方法(假设您有一个带有“duration”列的数据帧)是
df.duration.map(pd.Timedelta.to_pytimedelta)/np.timedelta64(1,'D')
。这基本上以天为单位返回持续时间,类似于
date2num
对日期所做的操作。非常整洁!谢谢链接。
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()