Python Dash调用matplotlib函数

时间:2019-09-27 15:57:13

标签: python matplotlib plotly-dash

Dash是用于交互可视化的出色Python软件包。我对这个库的感觉是,它在结构数据分析方面很棒,但是在涉及非结构化数据(例如图像和视频)时却不是那么好。

作为一种变通方法,如果在使用Dash时需要显示图像,请使用matplotlib库。我显示以下示例来阐明我的观点:

      @app.callback([Output("id_badframe_video", "children")],
                      [Input("id_generate_badframe_video_button","n_clicks")],
                      [State("id_dataset_name_list","value"),
                       State('id_video_name_list','value'),
State('id_video_index_list', 'value'])
        def generate_bad_video(nclick, dataset_name, video_name, frame_index):
            if nclick:
            img = read_image(dataset_name, video_name, frame_index)
            import matplotlib.pyplot as plt
            plt.close()
            fig, ax = plt.subplots(1) 
            ax.imshow(img, cmap='gray')

在上面的代码中,我想基于用户的输入来演示图像:数据集名称,视频名称和视频索引。然后,当我按Show Image按钮时,图像将显示在单独的窗口中(不在http://127.0.0.1:8050/内)。一开始我以为这是个好主意,但后来发现显示了几张图像后,程序将崩溃并显示以下错误消息:

Error on request:
Traceback (most recent call last):
  File "/home/lib/python2.7/site-packages/werkzeug/serving.py", line 303, in run_wsgi
    execute(self.server.app)
  File "/home/lib/python2.7/site-packages/werkzeug/serving.py", line 294, in execute
    write(data)
  File "/home/lib/python2.7/site-packages/werkzeug/serving.py", line 257, in write
    self.send_header(key, value)
  File "/home/lib/python2.7/BaseHTTPServer.py", line 412, in send_header
    self.wfile.write("%s: %s\r\n" % (keyword, value))
IOError: [Errno 32] Broken pipe
Tcl_AsyncDelete: cannot find async handler

关于如何解决此问题的任何想法?谢谢。

1 个答案:

答案 0 :(得分:0)

您不能在Dash回调中调用matplotlib的imgshow。即使它没有引发该错误,它也不会在您需要的位置获得图像。请记住,您的回调函数需要返回一些数据(对于您的代码而言),这些数据将被注入ID为id_badframe_video的DOM元素中。因此,您需要以某种方式获取图像数据并从回调中返回它。

matplotlib文档具有a recipe,用于对图像数据进行base64编码,并使用img属性中的图像数据创建一个src元素。我建议修改此配方,以便您的回调返回类似以下的内容(假设您在变量img_data中有base64编码的图像):

html.Img(src=f"data:image/png;base64,{data}")

(可能您实际上根本不需要matplotlib)