Matplotlib Agg渲染复杂性错误

时间:2012-01-16 05:06:58

标签: python python-3.x matplotlib

我正在尝试使用Python matplotlib打印600 dpi图表。但是,Python绘制了8个图中的2个,并输出错误:

OverflowError: Agg rendering complexity exceeded. Consider downsampling or decimating your data.

我正在绘制大量数据(每列7,500,000个数据),所以我想这可能是一些重载问题,或者我需要设置一个大的cell_block_limit。

我尝试在Google上搜索更改cell_block_limit的解决方案,但无济于事。什么是好方法?

代码如下: -

        import matplotlib.pyplot as plt
        from matplotlib.ticker import MultipleLocator, FormatStrFormatter

        majorLocator   = MultipleLocator(200)
        majorFormatter = FormatStrFormatter('%d')
        minorLocator   = MultipleLocator(20)

        fig = plt.figure()
        ax = fig.add_subplot(111)
        ax.xaxis.set_major_locator(majorLocator)
        ax.xaxis.set_major_formatter(majorFormatter)
        ax.xaxis.set_minor_locator(minorLocator)
        ax.xaxis.set_ticks_position('bottom')
        ax.xaxis.grid(True,which='minor')
        ax.yaxis.grid(True)
        plt.plot(timemat,fildata)
        plt.xlabel(plotxlabel,fontsize=14)
        plt.ylabel(plotylabel,fontsize=14)      
        plt.title(plottitle,fontsize=16)
        fig.savefig(plotsavetitle,dpi=600)

2 个答案:

答案 0 :(得分:15)

除了@Lennart指出不需要全分辨率之外,您还可以考虑类似以下的情节。

如果使用原始数组的2D视图和axis关键字arg到x.min(),{{1>计算“chunked”版本的max / mean / min非常简单有效等等。

即使使用过滤,绘制它也比绘制完整数组要快得多。

(注意:要绘制这么多点,你必须稍微调低一下噪音水平。否则你会得到你提到的x.max()。如果你想比较绘制“完整”数据集,将OverflowError行更改为更像y += 0.3 * y.max() np.random...或完全删除。)

0.1

enter image description here

答案 1 :(得分:3)

使用600dpi时,您必须将绘图宽度为13米才能绘制数据,而不会对其进行抽取。 : - )

我建议将数据分块成几百甚至一千个样本,然后从中提取最大值。

这样的事情:

def chunkmax(data, chunk_size):
    source = iter(data)
    chunk = []
    while True:
        for i in range(chunk_size):
            chunk.append(next(source))

        yield max(chunk)

然后,如果chunk_size为1000,则会给出7500点绘图,然后您可以轻松地看到数据在震荡的位置。 (除非数据如此嘈杂,否则你必须对其进行平均以确定是否存在楔块。但这也很容易解决。)