我目前有一个数据集,其中的每一行都有效或无效,有效性是由True或False列声明的。
可以在下面的代码段中查看数据集的示例:
TimeStamp Avg. Values ... Validity
0 2015-02-14 20:30:00 5.1736 ... False
1 2015-02-14 20:40:00 16.6266 ... True
2 2015-02-14 20:50:00 12.7667 ... True
3 2015-02-14 21:00:00 11.6077 ... False
4 2015-02-14 21:10:00 19.6851 ... True
... ... ... ...
1000 2015-06-12 23:30:00 1.699 ... True
1001 2015-06-12 23:40:00 2.2468 ... False
1002 2015-06-12 23:50:00 3.1147 ... False
1003 2015-06-13 00:00:00 6.141 ... True
1004 2015-06-13 00:10:00 3.792 ... True
我的目标是考虑到列的有效性,在一段时间内像Gantt图一样绘制Validity。因此,我的想法是我将生成指示时间段内数据类别的水平条。我编写的一个示例并未反映上述数据,但它说明了我想要实现的目标是:
到目前为止,我看到的大多数水平条形图仅显示每个类别的数据量。因此,是否可能以某种方式像甘特图那样绘制它,以显示随时间变化的类别?
答案 0 :(得分:1)
使用plt.barh
,您可以使用10分钟作为小节的宽度来指示所有开始位置。用'none'颜色为不需要的位置上色:
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
dates = pd.date_range(start='2020-02-14 20:30', end='2020-02-24', freq='10min')
data = pd.DataFrame({'Timestamp': dates,
'Validity': (np.round(np.random.uniform(0, .02, len(dates)).cumsum()) % 2).astype(bool)})
color = 'dodgerblue'
plt.barh(y=1, left=data['Timestamp'], width=1/24/6, height=0.3,
color=['none' if not val else color for val in data['Validity']])
plt.axhline(1, color=color)
plt.barh(y=0, left=data['Timestamp'], width=1/24/6, height=0.3, color=['none' if val else color for val in data['Validity']])
plt.axhline(0, color=color)
plt.gca().xaxis.set_major_locator(mdates.AutoDateLocator())
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d-%b'))
plt.yticks([0, 1], ['False', 'True'])
# plt.xticks(rotation=30)
plt.margins(y=0.4)
plt.ylabel('Validity')
plt.xlabel('Timestamp')
plt.tight_layout()
plt.show()
这是一种稍微复杂一些的方法,允许不定期的时间戳记。
首先将布尔列转换为整数(0
的{{1}}和false
的{{1}})。然后计算连续条目之间的差异。这将显示零,而值保持不变,其中1
的{{1}}翻转为true
,而-1
的翻转回到False
。发生这种情况的索引可用于索引时间戳。为了避免第一个索引和最后一个索引出现问题,需要在数组的开头添加一个伪值。
True