如何在使用重新样式时在绘图中获得固定的轴范围



我想在plotly中有一个交互式折线图,它有两个按钮,您可以从中选择要绘制的数据。我设法做到了这一点,但当绘图更新时,y轴范围随着每次更新而变化,这是我不想要的。我在这里检查了几个建议将autorange设置为False的主题,但这似乎不起作用。我目前拥有的代码如下(不起作用(:

import numpy as np
import pandas as pd
import plotly.graph_objects as go
import datetime

np.random.seed(123)
df = pd.DataFrame(np.random.randint(-10, 12, size=(200, 4)),
columns=list('ABCD'))
datelist = pd.date_range(datetime.datetime(2020, 1, 1).strftime('%Y-%m-%d'),
periods=200).tolist()
df2 = df.copy()
df['dates'] = datelist 
df = df.set_index(['dates'])
df.index = pd.to_datetime(df.index)
df.iloc[0] = 0
df = df.cumsum()
df2['dates'] = datelist 
df2 = df2.set_index(['dates'])
df2.index = pd.to_datetime(df2.index)
df2.iloc[0] = 0
df2 = df2.cumsum()

# # plotly
fig = go.Figure()
# set up ONE trace
fig.add_trace(go.Scatter(x=df.index,
y=df[df.columns[0]],
visible=True,
)
)
buttons1 = []
buttons2 = []
fig.add_trace(go.Scatter(x=df2.index,
y=df2[df.columns[0]],
visible=True)
)

# button with one option for each dataframe
for col in df.columns:
buttons1.append(dict(method='restyle',
label=col,
visible=True,
args=[{'y':[df[col]],
'x':[df.index],
'type':'scatter'}, [0]],
)
)




# button with one option for each dataframe
for col in df2.columns:
buttons2.append(dict(method='restyle',
label=col,
visible=True,
args=[{'y':[df2[col]],
'x':[df2.index],
'type':'scatter'}, [0]],
)
)


# some adjustments to the updatemenus
updatemenus = []
updatemenus.append(dict())
updatemenus[0]['buttons'] = buttons1
updatemenus[0]['direction'] = 'down'
updatemenus[0]['showactive'] = True
updatemenus[0]['y'] = 1.12
updatemenus.append(dict())
updatemenus[1]['buttons'] = buttons2
updatemenus[1]['direction'] = 'down'
updatemenus[1]['showactive'] = True
updatemenus[1]['y'] = 1
# add dropdown menus to the figure
fig.update_layout(showlegend=False, updatemenus=updatemenus)
fig.update_yaxes(dict(range=[-400, 400],
autorange=False))
fig.show()
fig.write_html("./plot.html")

如果您不在按钮定义中使用'type':'scatter',则会根据需要执行此操作。此外,我使用DF的实际范围来设置y轴。

# button with one option for each dataframe
for col in df.columns:
buttons1.append(dict(method='restyle',
label=col,
visible=True,
args=[{'y':[df[col]],
'x':[df.index],
#                                'type':'scatter'
}, [0]],
)
)




# button with one option for each dataframe
for col in df2.columns:
buttons2.append(dict(method='restyle',
label=col,
visible=True,
args=[{'y':[df2[col]],
'x':[df2.index],
#                                'type':'scatter'
}, [0]],
)
)
fig.update_yaxes(dict(range=[min(df.min().min(), df2.max().max()), max(df.max().max(), df2.max().max())],
autorange=False))

最新更新