栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Matplotlib无法在Django上渲染多个轮廓图

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Matplotlib无法在Django上渲染多个轮廓图

首先,让我开始说,通过调用

_test_chart
几个线程可以更轻松地重现

from threading import Threadfor i in xrange(2):    Thread(target=_test_chart).start()

执行上述操作后,一个将按预期工作,而第二个将崩溃。


这样做的简单原因是pyplot模块不是为多线程设计的,因此,两个图表在尝试绘制时会混淆它们的数据。

可以用mdboom更好地解释


pyplot用于在命令行方便地进行绘制,并保持全局状态。例如,当您说plt.figure()时,它会将图形添加到全局列表中,然后将“当前图形”指针设置为最近创建的图形。然后,随后的绘图命令将自动写入该图形。显然,这不是线程安全的…

有两种方法可以解决此问题,

  1. 强制在不同的过程中绘制这些图表。

    for i in xrange(2):
    pool = Pool(processes=1)
    pool.apply(_test_chart)

尽管这将起作用,但是您会发现性能显着下降,因为创建流程和生成图表所花的时间通常一样长(我认为这是不可接受的!)

  1. 真正的解决方案是使用Matplotlib的OO接口模块,该模块然后将允许您使用正确的对象-本质上,这适用于处理子图而不是图。对于问题中的给定示例,这类似于以下内容

    def _test_chart2():

    delta = 0.5x = arange(-3.0, 4.001, delta)y = arange(-4.0, 3.001, delta)X, Y = np.meshgrid(x, y)Z1 = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1)Z = (Z1 - Z2) * 10fig = figure(figsize=(10, 5))ax1 = fig.add_subplot(111)extents = [x.min(), x.max(), y.min(), y.max()]im = ax1.imshow(Z,     interpolation='spline36',     extent=extents,     origin='lower',     aspect='auto',     cmap=cm.jet)ax1.contour(X, Y, Z, 10, colors='k')jpg_image_buffer = cStringIO.StringIO()fig.savefig(jpg_image_buffer)array = base64.b64enpre(jpg_image_buffer.getvalue())jpg_image_buffer.close()return array


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/669867.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号