Showing a simple matplotlib plot in plotly Dash

10,866

Solution 1

Refer to https://plot.ly/matplotlib/modifying-a-matplotlib-figure/ . There is a mpl_to_plotly function in plotly.tools library that will return a plotly figure(which can then be returned to Graph's figure attribute) from matplotlib figure.

Edit: Just noticed you asked this a while back. Maybe the above is a new feature but its the cleanest way.

Solution 2

If you don't want an interactive plot, you can return a static one (found from this help)

import io
import base64

...

app.layout = html.Div(children=[
    ...,

    html.Img(id='example') # img element
])

@app.callback(
    dash.dependencies.Output('example', 'src'), # src attribute
    [dash.dependencies.Input('n_points', 'value')]
)
def update_figure(n_points):
    #create some matplotlib graph
    x = np.random.rand(n_points)
    y = np.random.rand(n_points)
    buf = io.BytesIO() # in-memory files
    plt.scatter(x, y)
    plt.savefig(buf, format = "png") # save to the above file object
    plt.close()
    data = base64.b64encode(buf.getbuffer()).decode("utf8") # encode to html elements
    return "data:image/png;base64,{}".format(data)

Solution 3

UserWarning: Starting a Matplotlib GUI outside of the main thread will likely fail

in my case it works, despite the warning message 👍👍

Share:
10,866
Giora Simchoni
Author by

Giora Simchoni

Phd Candidate, Data Scientist, subspecies Statistician. R, Scala, Python, Hadoop, Spark and whatever comes my way. Tends to write long detailed questions, here this is a plus.

Updated on June 14, 2022

Comments

  • Giora Simchoni
    Giora Simchoni almost 2 years

    Is it possible to show a simple matplotlib plot (the kind usually generated by plt.show()) in plotly's Dash framework? Or just plotly-like graphs with plotly's Scatters and Data traces?

    Specifically I guess I need a different component than Graph (see below) and a way to return the simple plot in the update_figure function.

    Example:

    import dash
    import dash_core_components as dcc
    import dash_html_components as html
    import numpy as np
    import matplotlib.pyplot as plt
    
    app = dash.Dash()
    
    app.layout = html.Div(children=[
        html.H1(children='Hello Dash'),
    
        dcc.Slider(
            id='n_points',
            min=10,
            max=100,
            step=1,
            value=50,
        ),
    
        dcc.Graph(id='example') # or something other than Graph?...
    ])
    
    @app.callback(
        dash.dependencies.Output('example', 'figure'),
        [dash.dependencies.Input('n_points', 'value')]
    )
    
    def update_figure(n_points):
        #create some matplotlib graph
        x = np.random.rand(n_points)
        y = np.random.rand(n_points)
        plt.scatter(x, y)
        # plt.show()
        return None # return what, I don't know exactly, `plt`?
    
    if __name__ == '__main__':
        app.run_server(debug=True)
    
  • Tobbey
    Tobbey over 5 years
    This is a very accurate answer. Thank you
  • Balepur
    Balepur almost 3 years
    The above link is hitting a 404. Any alternatives?
  • stefaan1o
    stefaan1o almost 3 years
    This feature is considered deprecated see github.com/plotly/plotly.py/issues/1568