使用plt.barh,您可以指示所有开始位置,使用 10 分钟作为条形的宽度。用颜色“无”为不需要的位置着色:
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 用于false 和1 用于true)。然后计算连续条目之间的差异。这显示了零,而值保持不变,-1,其中False 翻转为True,+1 翻转回False。发生这种情况的索引可用于索引时间戳。为了避免第一个和最后一个索引出现问题,需要在数组的开始端附加一个虚拟值。
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)})
tm = data['Timestamp'].to_numpy()
tm = np.append(tm, tm[-1])
color = 'navy'
steps_true = np.diff(np.concatenate([[False], data['Validity'], [False]]).astype(int))
plt.barh(y=1, left=tm[np.flatnonzero(steps_true == 1)], height=0.2,
width=tm[np.flatnonzero(steps_true == -1)] - tm[np.flatnonzero(steps_true == 1)], color=color)
plt.axhline(1, color=color)
steps_false = np.diff(np.concatenate([[True], data['Validity'], [True]]).astype(int))
plt.barh(y=0, left=tm[np.flatnonzero(steps_false == -1)], height=0.2,
width=tm[np.flatnonzero(steps_false == 1)] - tm[np.flatnonzero(steps_false == -1)], color=color)
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.margins(y=0.4)
plt.ylabel('Validity')
plt.xlabel('Timestamp')
plt.tight_layout()
plt.show()