如何解决 matplotlib 中的溢出错误?
How can I work around overflow error in matplotlib?
我正在使用 scipy.integrate 的 odeint 包求解一组耦合微分方程。
积分时间我有:
t=numpy.linspace(0,8e+9,5e+06)
其中 5e+06 是时间步。
然后我绘制方程式:
plt.xscale('symlog') #x axis logarithmic scale
plt.yscale('log',basey=2) #Y axis logarithmic scale
plt.gca().set_ylim(8, 100000) #Changing y axis ticks
ax = plt.gca()
ax.yaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
ax.xaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
plt.title("Example graph")
plt.xlabel("time (yr)")
plt.ylabel("quantity a")
plt.plot(t,a,"r-", label = 'Example graph')
plt.legend(loc='best')
其中 a 是时间因变量。 (这只是众多图表中的一张。)
但是,图表看起来有点参差不齐,而不是振荡,我得到了这个错误:
OverflowError: Exceeded cell block limit (set 'agg.path.chunksize' rcparam)
我不太清楚这个错误是什么意思,我看过其他答案但不知道如何实现 'agg.path.chunksize'。
此外,集成 + 绘图需要大约 7 个小时,而且还有一些 CPU 处理技巧,所以我真的不想实施任何会增加时间的东西。
如何克服这个错误?
我试图减少时间步长,但我得到了这个错误:
Excess work done on this call (perhaps wrong Dfun type).
Run with full_output = 1 to get quantitative information.
如错误信息所示,您可以set the chunksize to a larger value。
plt.rcParams['agg.path.chunksize'] = 1000
不过你也可以批判性地反思为什么会出现这个错误。只有当您试图在图表上绘制不合理的大量数据时才会发生。这意味着,如果您尝试绘制 200000000 个点,渲染器可能无法将它们全部保存在内存中。但或许应该问问自己,为什么要密谋这么多点?一个屏幕可能在横向显示大约 2000 个点,一张打印纸可能显示 6000 个。一般来说,使用更多的点没有意义。
现在,如果微分方程的解需要较大的点密度,这并不意味着您需要将它们全部绘制出来。
例如可以每 100 个点绘制一次,
plt.plot(x[::100], y[::100])
很可能甚至不影响视觉情节的出现。
我正在使用 scipy.integrate 的 odeint 包求解一组耦合微分方程。
积分时间我有:
t=numpy.linspace(0,8e+9,5e+06)
其中 5e+06 是时间步。
然后我绘制方程式:
plt.xscale('symlog') #x axis logarithmic scale
plt.yscale('log',basey=2) #Y axis logarithmic scale
plt.gca().set_ylim(8, 100000) #Changing y axis ticks
ax = plt.gca()
ax.yaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
ax.xaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
plt.title("Example graph")
plt.xlabel("time (yr)")
plt.ylabel("quantity a")
plt.plot(t,a,"r-", label = 'Example graph')
plt.legend(loc='best')
其中 a 是时间因变量。 (这只是众多图表中的一张。)
但是,图表看起来有点参差不齐,而不是振荡,我得到了这个错误:
OverflowError: Exceeded cell block limit (set 'agg.path.chunksize' rcparam)
我不太清楚这个错误是什么意思,我看过其他答案但不知道如何实现 'agg.path.chunksize'。
此外,集成 + 绘图需要大约 7 个小时,而且还有一些 CPU 处理技巧,所以我真的不想实施任何会增加时间的东西。
如何克服这个错误?
我试图减少时间步长,但我得到了这个错误:
Excess work done on this call (perhaps wrong Dfun type).
Run with full_output = 1 to get quantitative information.
如错误信息所示,您可以set the chunksize to a larger value。
plt.rcParams['agg.path.chunksize'] = 1000
不过你也可以批判性地反思为什么会出现这个错误。只有当您试图在图表上绘制不合理的大量数据时才会发生。这意味着,如果您尝试绘制 200000000 个点,渲染器可能无法将它们全部保存在内存中。但或许应该问问自己,为什么要密谋这么多点?一个屏幕可能在横向显示大约 2000 个点,一张打印纸可能显示 6000 个。一般来说,使用更多的点没有意义。
现在,如果微分方程的解需要较大的点密度,这并不意味着您需要将它们全部绘制出来。
例如可以每 100 个点绘制一次,
plt.plot(x[::100], y[::100])
很可能甚至不影响视觉情节的出现。