Matplotlib布尔图矩形填充

时间:2018-04-03 16:23:26

标签: python matplotlib

我想用Matplotlib& amp;创建一个布尔数据图。蟒蛇。我有几个布尔通道,如果通道是= 1(或True)

我想填充颜色

我找到了 this C# question显示了我想要的底部情节 this image

我目前的想法是使用具有共享x轴的多个子图,并使用fill_between来填充我的频道= 1的时间。

在我继续编码之前,我想知道Matplotlib中是否已经有一些东西可以让这更容易了?我不想担心y值来控制高度,而是更像是水平条形图,除了我的x轴是时间序列而我的条形图中有间隙。

1 个答案:

答案 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()

输出应如下所示: boolean plot