【问题标题】:Python Dash call matplotlib functionsPython Dash 调用 matplotlib 函数
【发布时间】:2019-09-27 15:57:13
【问题描述】:

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

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

【问题讨论】:

    标签: python matplotlib plotly-dash


    【解决方案1】:

    您不能在 Dash 回调中调用 matplotlib 的 imgshow。即使它没有抛出该错误,它仍然无法在您需要的地方获得图像。请记住,您的回调需要返回一些数据(在您的代码的情况下)将被注入 ID 为 id_badframe_video 的 DOM 元素中。所以你需要以某种方式获取图像数据并从回调中返回。

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

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

    (有可能你实际上并不需要 matplotlib)

    【讨论】:

      猜你喜欢
      • 2020-06-08
      • 2020-09-22
      • 2013-01-20
      • 2015-04-29
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      • 2021-05-22
      相关资源
      最近更新 更多