我正在尝试使用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)
答案 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
答案 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点绘图,然后您可以轻松地看到数据在震荡的位置。 (除非数据如此嘈杂,否则你必须对其进行平均以确定是否存在楔块。但这也很容易解决。)