我想用Matplotlib& amp;创建一个布尔数据图。蟒蛇。我有几个布尔通道,如果通道是= 1(或True)
我想填充颜色我找到了 this C# question显示了我想要的底部情节 this image。
我目前的想法是使用具有共享x轴的多个子图,并使用fill_between
来填充我的频道= 1的时间。
在我继续编码之前,我想知道Matplotlib中是否已经有一些东西可以让这更容易了?我不想担心y值来控制高度,而是更像是水平条形图,除了我的x轴是时间序列而我的条形图中有间隙。
答案 0 :(得分:0)
我已经使用matplotlib ax.hlines
解决了这个问题。
我还使用了一个函数来查找数组中真实值的开始和结束idx。我是从SO的另一篇文章中得到的,但现在找不到了!
import numpy as np
def findones(a):
isone = np.concatenate(([0], a, [0]))
absdiff = np.abs(np.diff(isone))
ranges = np.where(absdiff == 1)[0].reshape(-1, 2)
return np.clip(ranges, 0, len(a) - 1)
def plotbooleans(ax, dictofbool):
ax.set_ylim([-1, len(dictofbool)])
ax.set_yticks(np.arange(len(dictofbool.keys())))
ax.set_yticklabels(dictofbool.keys())
for i, (key, value) in enumerate(dictofbool.items()):
indexes = findones(value)
for idx in indexes:
if idx[0] == idx[1]:
idx[1] = idx[1]+1
ax.hlines(y=i, xmin=idx[0], xmax=idx[1], linewidth=10, colors='r')
return ax
测试代码:
import matplotlib.pyplot as plt
testarray = np.array([1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1])
testbool = {}
for i in range(0, 5):
testbool['bool_{}'.format(i)] = testarray
fig, ax = plt.subplots()
ax = plotbooleans(ax, testbool)
plt.grid()
plt.subplots_adjust(bottom=0.2)
plt.show()