Matplotlib - 堆积条形图〜约1000条

时间:2013-01-10 00:42:43

标签: python-3.x matplotlib bar-chart

背景

我正在开发一个程序来显示3d数据的横截面。数据以x,y,z1,z2,z3等格式存储在一个简单的文本csv文件中。我取一个起点和终点并浏览数据集(~110,000行),在这些数据集之间创建一系列点两个位置,并将它们转储到一个数组中。这很好,而且相当快(大约需要0.3秒)。为了显示这一行,我一直在创建一个matplotlib堆积条形图。但是,程序的总运行时间约为5.5秒。我把它的大部分(价值3秒)缩小到下面的代码 'values'是一个数组,其中包含x,y和z值以及一个前导标识符,该标识符在此部分代码中未使用。第一个plt.bar绘制条形截面,第二个用于创建-2000的任意平面。为了生成一个连续观察的部分,我使用每个零条之间的间隔。

    import matplotlib.pyplot as plt

    for values in crossSection:
        prevNum = None
        layerColour = None
        if values != None:
            for i in range(3, len(values)):
                if values[i] != 'n':
                    num = float(values[i].strip())

                    if prevNum != None:
                        plt.bar(spacing, prevNum-num, width=interval, \
                                bottom=num, color=layerColour, \
                                edgecolor=None, linewidth=0)

                    prevNum = num

                    layerColour = layerParams[i].strip()

            if prevNum != None:        
                plt.bar(spacing, prevNum+2000, width=interval, bottom=-2000, \
                                    color=layerColour, linewidth=0)

        spacing += interval

我确信有一种更有效的方法可以做到这一点,但我是Matplotlib的新手并且仍然不熟悉其功能。代码中时间的另一个主要用途是:

plt.savefig('output.png')

这需要大约一秒钟,但我认为这是预期保存文件,我无法做任何事情。

问题:

通过更好地使用plt.bar()或不同的Matplotlib函数,是否有更快的方法来生成相同的输出(堆积条形图或看起来像一个)?

修改 的 我忘了在原帖中提到我使用的是Python 3.2.3和Matplotlib 1.2.0

2 个答案:

答案 0 :(得分:2)

将此留在这里以防有人遇到同样的问题...
虽然与使用bar()不完全相同,但使用足够大的数据集(足够大以至于使用bar()需要几秒钟),结果与stackplot()无法区分。如果我使用tcaswell给出的方法将数据分层,并将其输入stackplot(),则会在0.2秒内创建图表,而不是3秒。

修改

tcaswell提供的代码将数据转换为图层:

accum_values = []
for values in crosssection:
    accum_values.append([float(v.strip()) for v iv values[3:]])
accum_values = np.vstack(accum_values).T 
layer_params = [l.strip() for l in layerParams]
bottom = numpy.zeros(accum_values[0].shape)

答案 1 :(得分:1)

看起来您正在绘制每个条形图,您可以将序列传递到bar(请参阅此example

我认为:

accum_values = []
for values in crosssection:
    accum_values.append([float(v.strip()) for v iv values[3:]])


accum_values = np.vstack(accum_values).T 
layer_params = [l.strip() for l in layerParams]
bottom = numpy.zeros(accum_values[0].shape)

ax = plt.gca()
spacing = interval*numpy.arange(len(accum_values[0]))
for data,color is zip(accum_values,layer_params):
    ax.bar(spacing,data,bottom=bottom,color=color,linewidth=0,width=interval)
    bottom += data

会更快(因为每次调用bar都会创建一个BarContainer,我怀疑你的问题来源是你为每个栏创建一个,而不是每个层都有一个。)

我真的不明白你在底部下面有顶部的杆子做了什么,所以我没有尝试实现它,所以你必须适应这一点。