3

我在这个主题上搜索了很多,但我不是网络开发人员,所以我知道我错过了一些概念。

当我在本地运行 matplotlib 并指定“webagg”后端时,运行 plt.show() 会启动一个轻量级网络服务器并在我的浏览器中打开具有完整交互功能的绘图。

import matplotlib as mpl
mpl.use('webagg')
from matplotlib import pyplot as plt
import numpy as np

f,ax = plt.subplots(1)
ydata = np.random.randint(0,100,100)
xdata = np.linspace(1,100,100)
ax.plot(xdata,ydata,picker=5)
ax.set_title('Click the line to change the color')

def onpick(event):
    event.artist.set_color('red')

    f.canvas.draw_idle()
f.canvas.mpl_connect('pick_event', onpick)

plt.show()

我的问题是:是否可以将 webagg 后端与我的 django 网站一起使用,为用户提供整洁的交互式 matplotlib 图形?换句话说,我可以在我的 django 网站的某个地方使用上面的代码,以便将情节嵌入到网页中吗?

(我知道 mpld3 之类的工具,它们非常酷,但没有在 matplotlib 中完全重新创建小部件/选择器功能)。

4

1 回答 1

2

有一个如何使用web_agg 和 Tornado嵌入交互式图形的示例。我成功地将其更改为使用 Flask,但仍然使用 Tornado 网络套接字。首先尝试运行下面的示例,看看交互性对您来说是否“足够好”。当我运行它时,响应并不是非常快速(如果您想了解更多信息,请阅读最后一部分)。

基本上要在网页上实现它,您使用 websocket 来发送/接收交互部分的消息,并在必须重绘时将绘图作为二进制数据发送。

按照示例,它可以非常直接地用于不同的框架/服务器(有关更多详细信息,请查看上面的链接):

  • 像平常一样创造你的身材。
  • 使用 webagg 后端为您的图形创建管理器
  • 提供 mpl.js
  • 实现一个 websocket 对象,它需要 send_json 和 send_binary 函数(当你将 websocket 添加到管理器时,这些是从 webagg python 代码中调用的)
  • 在您在客户端提供的模板中。使用 javascript 创建 websocket 并使用 mpl.js 创建图形。

最好浏览一下webagg github 的东西(webagg_core、webagg、mpl.js,也许还有 nb_agg)。我知道这不是一个完整的答案,但希望它能给你一些关于你需要做什么的方向。

关于第一段中的评论有点离题:

不幸的是,我是 web 开发的新手,以确定响应是否是示例中 web_agg 实现方式的限制,或者它是否取决于您的服务器/后端/线程的设置方式。据我所知,jupyter notebook nb_agg 后端也使用了 web_agg 后端的一部分,并且在 notebook 中的响应速度似乎更快。但我可能应该提出一个单独的问题来讨论这些问题。

于 2017-04-29T20:38:20.980 回答