情节.在多个绘图中使用滑块控件 [英] Plot.ly. Using slider control with multiple plots
问题描述
I'd like to add the slider control to my plotly graph (pic) to control all elements simultaneously.
我可以轻松地将滑块控件添加到只有一行的图形中.在这种情况下,我将情节列表(以字典形式)放入 data 变量:
I can easily add slider control to graph with only one line. In this case I put a list of plots (in form of dicts) into data variable:
plotly.graph_objs.Figure(数据= [plot1,plot2] ,布局=布局)
plotly.graph_objs.Figure (data = [plot1,plot2], layout = layout)
而且效果很好.
但是为了在同一张图上绘制多条线,我必须将带有图的列表列表放入数据变量(有I吗?):
But in order to plot multiple lines on the same graph, I have to put list of lists with plots into data variable ( have I ? ):
plotly.graph_objs.Figure(数据= [[plot1.1,plot2.1],[plot1.2,plot2.2] ,布局=布局)
plotly.graph_objs.Figure (data = [[plot1.1, plot2.1], [plot1.2, plot2.2]], layout = layout)
但是plot.ly仍然需要字典列表.
But plot.ly still expects the list of dicts.
条目应为dict的子类.
有没有一种方法可以使用一个滑块控件同时控制多个元素?
Are there any way to control multiple elements simultaneously using one slider control?
import plotly
import plotly.plotly as py
import numpy as np
plotly.offline.init_notebook_mode()
exp = 2.71
N = 3
x_start = -N
x_end = N
dx = 0.1
y_start = -N
y_end = N
dy = 0.1
x_axis = np.arange(x_start, x_end, dx)
y_axis = np.arange(y_start, y_end, dy)
def pit(offset, x):
pit1 = []
for position in x:
pit1.append(1 - exp**(-36 * (position - offset)**2))
return pit1
def v_x(x):
vx = exp**(-x**2)
return vx
def v_y(x):
vy = 0.5 * exp**(-x**2)
return vy
def density(vx, vy):
den = []
for v1 in vx:
row = []
for v2 in vy:
row.append(v1 * v2)
den.append(row)
return den
vx = v_x(x_axis)
vy = v_y(y_axis)
den = density(vx, vy)
def contour(step=None):
return dict(
type='contour',
z=den,
colorscale=[[0, 'rgb(255,255,255)'], [1, 'rgb(49,163,84)']],
x=x_axis,
y=y_axis,
)
def vy_projection(step):
return dict(
visible=True,
type='scatter',
name=str(step),
marker=dict(color='rgb(255,0,0)'),
yaxis='y2',
x=x_axis,
y=vx * pit(step, x_axis)
)
def vx_projection(step):
return dict(
visible=True,
type='scatter',
name=str(step),
marker=dict(color='rgb(255,0,255)'),
xaxis='x2',
x=vy,
y=y_axis
)
trace1 = [
[vy_projection(step), vx_projection(step)]
for step in np.arange(-3, 3, 0.5)]
for plot in trace1[-1]:
plot['visible'] = True
steps = []
for i in range(len(trace1)):
step = dict(
method='restyle',
args=['visible', [False] * len(trace1)],
)
step['args'][1][i] = True
steps.append(step)
sliders = [dict(
active=10,
currentvalue={"prefix": "Step: "},
pad={"t": len(trace1)},
steps=steps
)]
layout = dict(
autosize=False,
width=500,
height=500,
sliders=sliders,
xaxis=dict(
range=[-3, 3],
),
xaxis2=dict(
domain=[0.9, 1],
showgrid=False,
zeroline=False,
),
yaxis=dict(
range=[-3, 3],
),
yaxis2=dict(
domain=[0.9, 1],
showgrid=False,
zeroline=False,
)
)
data = trace1[0]
fig = go.Figure(data=data, layout=layout)
# plotly.offline.plot(fig, filename='manipulate.html')
plotly.offline.iplot(fig)
推荐答案
以下是使用滑块控件处理多条迹线的最小工作示例.
Here is minimal working example of using a slider control to manipulate multiple traces.
import plotly
plotly.offline.init_notebook_mode()
trace1 = dict(
type='scatter',
x=[0, 1],
y=[0, 0.5]
)
trace2 = dict(
type='scatter',
x=[0, 1],
y=[0, -0.5]
)
trace3 = dict(
type='scatter',
x=[0, 1],
y=[0, 1]
)
trace4 = dict(
type='scatter',
x=[0, 1],
y=[0, -1]
)
steps = [None, None]
steps[0] = dict(
method='restyle',
args=[
'visible', [False, True]
],
)
steps[1] = dict(
method='restyle',
args=[
'visible', [True, False]
],
)
sliders = dict(
steps=steps
)
layout = dict(
sliders=[sliders],
xaxis=dict(
range=[0, 1],
),
yaxis=dict(
range=[-1, 1],
),
)
data = plotly.graph_objs.Data([trace1, trace2, trace3, trace4])
fig = plotly.graph_objs.Figure(data=data, layout=layout)
# plotly.offline.plot(fig, filename='manipulate.html')
plotly.offline.iplot(fig)
这篇关于情节.在多个绘图中使用滑块控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!