Matplotlib带烧瓶的liveplot

时间:2018-06-01 11:10:59

标签: python matplotlib flask

我正在努力尝试使用烧瓶通过http POST来绘制我想要接收的数据。 我的代码由两部分组成,即烧瓶应用程序的启动脚本和负责绘图的LivePlot类。

LivePlot类,我尝试了三次尝试:

import matplotlib
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt

class LivePlot(object):
""" A live plotting class based on matplotlib """

    def __init__(self):

        self._x = []
        self._y = []

        # First attempt
        self._fig = plt.gcf()
        self._fig.show()
        self._fig.canvas.draw()

        # Second attempt
        #plt.ion()
        #plt.plot([0, 1])

        # Third attempt
        #plt.show()


    def add(self, x, y):
    """ Add point to live plot """
        self._x.append(x)
        self._y.append(y)
        self._refresh()

    def _refresh(self):
        plt.plot(self._x, self._y, color='b', marker='o')
        plt.xlim([min(self._x), max(self._x)])
        plt.ylim([min(self._y), max(self._y)])

        self._fig.canvas.draw()

烧瓶启动脚本:

import json

from flask import Flask, request
from flask_restplus import Api, Resource

from liveplot import LivePlot

APP = Flask(__name__)   
API = Api(APP)        

LIVE_PLOT = None

class LivePlotData(Resource):

    def post(self):
    """Add data point"""
        req = json.loads(request.data)
        LIVE_PLOT.add(float(req["x"]), float(req["y"]))
        return True

API.add_resource(LivePlotData, '/data')

if __name__ == '__main__':

    # Init LivePlot
    LIVE_PLOT = LivePlot()

    APP.run(debug=True,
            host=127.0.0.1,
            port=5000,
            use_reloader=False,
            threaded=True)

当我尝试运行第一次或第二次尝试时,我看到我的平铺窗口管理器正在分割屏幕,但没有窗口出现。 烧瓶应用程序正在运行,我可以向列表中添加新值,但图表不会出现。

当我运行第三次尝试时,会出现该图,但由于构造函数中的plt.show()命令阻止了脚本,因此应用程序无法启动。

顺便说一下。以下代码完美无缺:

import matplotlib.animation as animation
import matplotlib.pyplot as plt

fig = plt.gcf()
fig.show()
fig.canvas.draw()

x = []
y = []

for ix in range(0, 10):
    x.append(ix)
    y.append(int(input()))
    plt.plot(x, y, color='b', marker='o')
    plt.xlim([min(x), max(x)])
    plt.ylim([min(y), max(y)])
    fig.canvas.draw()

正如我上面提到的,我尝试了几个不同的代码片段,但是它们似乎都不适用于我。也许我错过了plt通话的完美组合,但此刻我被卡住了。

也许有人遇到了类似的问题,可以帮助我。 提前谢谢!

编辑:在工作示例中使用for循环替换True循环

0 个答案:

没有答案