设置X轴范围后更新Plotly Y轴范围

3

我正在使用Plotly绘制具有悠久历史的时间序列数据,并且默认情况下,我希望图表聚焦于最近的数据。我可以通过设置update_xaxes方法的range参数来实现这一点。然而,Y轴仍然基于整个数据的历史设置,而我希望它根据实际可见数据进行计算。例如,在下面的代码中,Y轴将被设置为(0,100)的范围,即使可见数据仅从50开始(因此期望Y轴上的范围更像是50-100)。如果用户稍后滚动或缩放X轴,我希望Y轴继续更新以适应可见数据。

import pandas as pd
import numpy as np
import plotly.express as px

n = 100
df = pd.DataFrame({'x': np.arange(n), 'y': np.arange(n)})
fig = px.line(df, x='x', y='y')
fig.update_xaxes(range=(50,99))
fig.show()

你也可以使用fig.update_yaxes来更新y轴的范围。 - Hamzah
1
但是我需要自己重新计算适当的范围吗?我也希望这可以与分面绘图一起使用,每个都有自己的Y轴范围,所以希望有更简单的方法。 - Abiel
你可以了解关于选择事件并使用选定区域的边界作为您的范围。https://plotly.com/python/v3/selection-events/ - Hamzah
1个回答

3
如果您希望y轴范围根据可见数据动态调整大小,则需要使用支持回调函数的DashFigureWidget。正如@Phoenix在评论中建议的那样,您可以使用Jupyter笔记本电脑来使用FigureWidget。以下是一个示例(为了调试目的,在标题中显示动态计算出的y轴范围):
import plotly.graph_objs as go
import plotly.offline as py

import pandas as pd
import numpy as np

py.init_notebook_mode()

n = 100
df = pd.DataFrame({'x': np.arange(n), 'y': np.arange(n)})
fig = go.FigureWidget([go.Scatter(x=df['x'], y=df['y'])])
fig.update_xaxes(range=(50,99))

def zoom(xrange):
    xrange_zoom_min, xrange_zoom_max = fig.layout.xaxis.range[0], fig.layout.xaxis.range[1]
    yaxis_range = df.loc[df['x'].between(xrange_zoom_min,xrange_zoom_max), 'y']
    padding = (yaxis_range.max() - yaxis_range.min()) / 16
    
    fig.layout.yaxis.range = [yaxis_range.min() - padding, yaxis_range.max() + padding]
    fig.layout.title = f"Setting new range to {fig.layout.yaxis.range}"

fig.layout.on_change(zoom, 'xaxis.range')

enter image description here


我认为你不需要这行代码 scatter = fig.data[0] - Hamzah
你可以仅使用 zoom(xrange) 而不需要布局。 - Hamzah
1
@Phoenix 哦,好的观点,感谢您的更正。 - Derek O
另一点,这个解决方案只在xrange_zoom_minxrange_zoom_max包含在数据框中时有效,否则它将不起作用。尝试多次缩放,你会发现y轴的填充已经不再起作用了。 - Hamzah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接