Showing a simple matplotlib plot in plotly Dash
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 👍👍
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, 2022Comments
-
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 theupdate_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 over 5 yearsThis is a very accurate answer. Thank you
-
Balepur almost 3 yearsThe above link is hitting a 404. Any alternatives?
-
stefaan1o almost 3 yearsThis feature is considered deprecated see github.com/plotly/plotly.py/issues/1568