Matplotlib python同时创建多个条形图

时间:2017-07-27 18:29:24

标签: python matplotlib

我在下面有以下python(matplotlib)代码,它们生成一组水平条形图(每个长度和位置)彼此独立。

执行大约需要12秒。

我可以通过某种方式一次创建一个整条或同时创建多个条形图吗?或者以任何方式加快速度?对plt.barh的调用是几乎占据所有时间的调用。

感谢。

import random,matplotlib.pyplot as plt,traceback,sys
names=['Asia','America','Africa','Australia']
list_empty_subsystems=[0 for i in range(len(names))]
x=range(len(names))

def add_barh(name, duration, _offset, label):

    global list_empty_subsystems
    try:

        bar_width=1

        time_offset_array=list_empty_subsystems[:]
        duration_list=list_empty_subsystems[:]
        time_offset_array[names.index(name)]=_offset
        duration_list[names.index(name)]=duration

        color='#'+str(hex(random.randint(0x100000,0xFFFFFE))[2:])
        #print color

        plt.barh(bottom=x, width=duration_list, height=bar_width,
                 color=color, alpha=1, left=time_offset_array,
                 edgecolor='#010101',linewidth=0.25)

    except Exception as e:
        print 'graph error',type(e),e,traceback.extract_tb(sys.exc_info()[-1], 1)[0],color

if __name__ == '__main__':


    time_=time.clock()
    for i in range(1000):
        index=random.randint(0,len(names)-1)

        add_barh(names[index],random.randint(0,100),random.randint(0,10),names[index])
    plt.yticks(range(len(names)), names)
    print time.clock()-time_

    plt.show()
    plt.close()

enter image description here

我找到了一些解决方案,使用patches.rectangle而不是barh用于相同目的,速度约为50倍。

1 个答案:

答案 0 :(得分:0)

首先,尝试在此stacked (vertical) bar graph示例之后对水平条形图进行建模(如果您还没有看到它)。 bar()和barh()的pyplot documentation非常相似,因此将这一切都用于水平图应该不是问题。

其次,让我们谈谈你在图表中想要绘制的内容:

-

当制作这样的图表时,通常会:

  1. 在不同的群体(澳大利亚,非洲,美国,亚洲)之间有条形区段(颜色),和
  2. 有超过20-40种不同类型的条形段(颜色)
  3. 为什么?

    • 常见的 减少渲染此图表所需的时间因为我们可以一次渲染多个条形段(在这种情况下,我们只会为每个行业运行一次barh()。
    • 少于20-40 不同类型的条形段也会缩短渲染时间,因为运行bar()函数40x实际上并没有那么糟糕。

    例如,如果我们要制作一个水平条形图,显示按行业(房地产,医疗保健,农业等)划分的四个区域的GDP细分,那么我们将有~20个细分市场在所有群体中都很常见。总的来说,这意味着我们只运行barh()函数 20x (与您运行函数 1000x 的示例相比)。

    这是一个很大的区别,我相信你会在运行时间看到相当明显的差异。