Plotly:如何使用 DASH 回调将多项式拟合线添加到 plotly go.scatter 图?
Plotly: How to add polynomial fit line to plotly go.scatter figure using a DASH callback?
我想将多项式曲线添加到使用回调呈现的散点图中。
以下是我的回调函数,returns 散点图。
@app.callback(Output('price-graph', 'figure'),
[
Input('select', 'value')
]
)
def update_price(sub):
if sub:
fig1 = go.Figure(
data=[go.Scatter(
x=dff['Count'],
y=dff['Rent'],
mode='markers'
)
],
layout=go.Layout(
title='',
xaxis=dict(
tickfont=dict(family='Rockwell', color='crimson', size=14)
),
yaxis=dict(
showticklabels = True
),
)
)
return fig1
结果图:
我可以使用 sklearn.preprocessing
添加 polyfit 线。
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
dff = df.groupby(['Rent']).size().reset_index(name='Count')
fig = plt.figure(figsize=(15,8))
x = dff['Count']
y = dff['Rent']
model = make_pipeline(PolynomialFeatures(4), LinearRegression())
model.fit(np.array(x).reshape(-1, 1), y)
x_reg = np.arange(90)
y_reg = model.predict(x_reg.reshape(-1, 1))
plt.scatter(x, y)
plt.plot(x_reg, y_reg)
plt.xlim(0,100)
plt.xlabel('Number of rental units leased')
plt.ylim(10,50)
plt.show()
有没有办法在 plotly 中做到这一点?
您尚未指定如何使用 DASH。在此示例中,我在 JupyterLab 中使用了 JupyterDASH(是的,这太棒了!)。
下图是由下面的代码片段生成的。该代码段使用回调函数更改设置多项式特征数的参数 nFeatures
in:
model = make_pipeline(PolynomialFeatures(nFeatures), LinearRegression())
model.fit(np.array(x).reshape(-1, 1), y)
我正在使用 dcc.Slider 来更改值。
nFeatures = 1 的默认设置
使用 nFeatures = 3 的滑块选择设置
完整代码:
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from jupyter_dash import JupyterDash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
from IPython.core.debugger import set_trace
# Load Data
df = px.data.tips()
# Build App
app = JupyterDash(__name__)
app.layout = html.Div([
html.H1("ScikitLearn: Polynomial features"),
dcc.Graph(id='graph'),
html.Label([
"Set number of features",
dcc.Slider(id='PolyFeat',
min=1,
max=6,
marks={i: '{}'.format(i) for i in range(10)},
value=1,
)
]),
])
# Define callback to update graph
@app.callback(
Output('graph', 'figure'),
[Input("PolyFeat", "value")]
)
def update_figure(nFeatures):
global model
# data
df = px.data.tips()
x=df['total_bill']
y=df['tip']
# model
model = make_pipeline(PolynomialFeatures(nFeatures), LinearRegression())
model.fit(np.array(x).reshape(-1, 1), y)
x_reg = x.values
y_reg = model.predict(x_reg.reshape(-1, 1))
df['model']=y_reg
# figure setup and trace for observations
fig = go.Figure()
fig.add_traces(go.Scatter(x=df['total_bill'], y=df['tip'], mode='markers', name = 'observations'))
# trace for polynomial model
df=df.sort_values(by=['model'])
fig.add_traces(go.Scatter(x=df['total_bill'], y=df['model'], mode='lines', name = 'model'))
# figure layout adjustments
fig.update_layout(yaxis=dict(range=[0,12]))
fig.update_layout(xaxis=dict(range=[0,60]))
print(df['model'].tail())
return(fig)
# Run app and display result inline in the notebook
app.enable_dev_tools(dev_tools_hot_reload =True)
app.run_server(mode='inline', port = 8070, dev_tools_ui=True, #debug=True,
dev_tools_hot_reload =True, threaded=True)
我想将多项式曲线添加到使用回调呈现的散点图中。
以下是我的回调函数,returns 散点图。
@app.callback(Output('price-graph', 'figure'),
[
Input('select', 'value')
]
)
def update_price(sub):
if sub:
fig1 = go.Figure(
data=[go.Scatter(
x=dff['Count'],
y=dff['Rent'],
mode='markers'
)
],
layout=go.Layout(
title='',
xaxis=dict(
tickfont=dict(family='Rockwell', color='crimson', size=14)
),
yaxis=dict(
showticklabels = True
),
)
)
return fig1
结果图:
我可以使用 sklearn.preprocessing
添加 polyfit 线。
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
dff = df.groupby(['Rent']).size().reset_index(name='Count')
fig = plt.figure(figsize=(15,8))
x = dff['Count']
y = dff['Rent']
model = make_pipeline(PolynomialFeatures(4), LinearRegression())
model.fit(np.array(x).reshape(-1, 1), y)
x_reg = np.arange(90)
y_reg = model.predict(x_reg.reshape(-1, 1))
plt.scatter(x, y)
plt.plot(x_reg, y_reg)
plt.xlim(0,100)
plt.xlabel('Number of rental units leased')
plt.ylim(10,50)
plt.show()
有没有办法在 plotly 中做到这一点?
您尚未指定如何使用 DASH。在此示例中,我在 JupyterLab 中使用了 JupyterDASH(是的,这太棒了!)。
下图是由下面的代码片段生成的。该代码段使用回调函数更改设置多项式特征数的参数 nFeatures
in:
model = make_pipeline(PolynomialFeatures(nFeatures), LinearRegression())
model.fit(np.array(x).reshape(-1, 1), y)
我正在使用 dcc.Slider 来更改值。
nFeatures = 1 的默认设置
使用 nFeatures = 3 的滑块选择设置
完整代码:
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from jupyter_dash import JupyterDash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline
from IPython.core.debugger import set_trace
# Load Data
df = px.data.tips()
# Build App
app = JupyterDash(__name__)
app.layout = html.Div([
html.H1("ScikitLearn: Polynomial features"),
dcc.Graph(id='graph'),
html.Label([
"Set number of features",
dcc.Slider(id='PolyFeat',
min=1,
max=6,
marks={i: '{}'.format(i) for i in range(10)},
value=1,
)
]),
])
# Define callback to update graph
@app.callback(
Output('graph', 'figure'),
[Input("PolyFeat", "value")]
)
def update_figure(nFeatures):
global model
# data
df = px.data.tips()
x=df['total_bill']
y=df['tip']
# model
model = make_pipeline(PolynomialFeatures(nFeatures), LinearRegression())
model.fit(np.array(x).reshape(-1, 1), y)
x_reg = x.values
y_reg = model.predict(x_reg.reshape(-1, 1))
df['model']=y_reg
# figure setup and trace for observations
fig = go.Figure()
fig.add_traces(go.Scatter(x=df['total_bill'], y=df['tip'], mode='markers', name = 'observations'))
# trace for polynomial model
df=df.sort_values(by=['model'])
fig.add_traces(go.Scatter(x=df['total_bill'], y=df['model'], mode='lines', name = 'model'))
# figure layout adjustments
fig.update_layout(yaxis=dict(range=[0,12]))
fig.update_layout(xaxis=dict(range=[0,60]))
print(df['model'].tail())
return(fig)
# Run app and display result inline in the notebook
app.enable_dev_tools(dev_tools_hot_reload =True)
app.run_server(mode='inline', port = 8070, dev_tools_ui=True, #debug=True,
dev_tools_hot_reload =True, threaded=True)