Matplotlib 在 Django 中挂起
Matplotlib hangs in Django
我正在尝试绘制一些由 Matplotlib 生成的图表,但我发现虽然它第一次工作正常,但如果我刷新我的页面,Matplotlib 将停留在 _tkinter.create
其内部运作的深处(Tkinter.py) 创建图形时 (plt.figure
)。我已经设法通过以下小示例缩小问题范围..
模板(只需要这一行)
<img src="data:image/png;base64,{{ graph }}"/>
图表创建
class PolarChart(object):
@staticmethod
def example_chart():
from math import pi, radians
import cStringIO
import base64
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
axis = fig.gca(polar=True)
n = 20
theta = np.linspace(0.0, 2 * pi, n, endpoint=False)
radii = 10 * np.random.rand(n)
axis.plot(theta, radii, marker='.', alpha=0.5, linewidth=1)
jpg_image_buffer = cStringIO.StringIO()
fig.savefig(jpg_image_buffer)
plt.close(fig)
base_array = base64.b64encode(jpg_image_buffer.getvalue())
jpg_image_buffer.close()
return base_array
查看
graph = PolarChart.example_chart()
return render(request, "test.html", {'graph': graph})
其他Whosebug问题建议使用fig.clear()
但是这样也会导致页面不渲染(一样的挂起效果)
问题原来是使用错误后端的问题...问题已通过 jenshnielsen's suggestion 解决,以更改导入前使用的后端 pyplot
import matplotlib
matplotlib.use('agg')
如果你正在阅读这篇文章,Jens,请post你自己的回答,我很乐意删除这个!
我正在尝试绘制一些由 Matplotlib 生成的图表,但我发现虽然它第一次工作正常,但如果我刷新我的页面,Matplotlib 将停留在 _tkinter.create
其内部运作的深处(Tkinter.py) 创建图形时 (plt.figure
)。我已经设法通过以下小示例缩小问题范围..
模板(只需要这一行)
<img src="data:image/png;base64,{{ graph }}"/>
图表创建
class PolarChart(object):
@staticmethod
def example_chart():
from math import pi, radians
import cStringIO
import base64
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
axis = fig.gca(polar=True)
n = 20
theta = np.linspace(0.0, 2 * pi, n, endpoint=False)
radii = 10 * np.random.rand(n)
axis.plot(theta, radii, marker='.', alpha=0.5, linewidth=1)
jpg_image_buffer = cStringIO.StringIO()
fig.savefig(jpg_image_buffer)
plt.close(fig)
base_array = base64.b64encode(jpg_image_buffer.getvalue())
jpg_image_buffer.close()
return base_array
查看
graph = PolarChart.example_chart()
return render(request, "test.html", {'graph': graph})
其他Whosebug问题建议使用fig.clear()
但是这样也会导致页面不渲染(一样的挂起效果)
问题原来是使用错误后端的问题...问题已通过 jenshnielsen's suggestion 解决,以更改导入前使用的后端 pyplot
import matplotlib
matplotlib.use('agg')
如果你正在阅读这篇文章,Jens,请post你自己的回答,我很乐意删除这个!