Logo
Section 1 / 7

折线图上的日期按钮

学习如何通过添加日期按钮来增强折线图,从而高效地筛选常用时间段的数据,并获得有价值的洞察。

导入

折线图上的日期按钮

学习如何通过添加日期按钮来增强折线图,从而高效地筛选常用时间段的数据,并获得有价值的洞察。

我们的数据

在本节课中,我们将使用阿里巴巴股票价格的一些数据。我们可以打印出前几行数据,以查看其结构:

1# 导入库 2import pandas as pd 3import numpy as np 4 5# 导入数据集 6alibaba = pd.read_csv('/usr/local/csvfiles//alibaba.csv', parse_dates=['Date']) 7print(alibaba.head())

让我们绘制所有数据,以观察其中的模式:

1# 导入库 2import pandas as pd 3import numpy as np 4import plotly.express as px 5import plotly.graph_objects as go 6from plotly.subplots import make_subplots 7 8# 导入数据集 9alibaba = pd.read_csv('/usr/local/csvfiles//alibaba.csv', parse_dates=['Date']) 10 11# 创建轨迹并添加 12trace1 = go.Scatter(x=alibaba['Date'], 13 y=alibaba['Open'], 14 marker=dict(color='#7F00FF'), 15 name='开盘价', 16 mode='lines') 17 18trace2 = go.Scatter(x=alibaba['Date'], 19 y=alibaba['Close'], 20 marker=dict(color='black'), 21 name='收盘价', 22 mode='lines') 23fig = go.Figure(data=[trace1, trace2]) 24 25# 格式化并显示 26fig.update_layout(title=go.layout.Title(text='阿里巴巴股票价格', x=0.5, xref='paper')) 27fig.show()

我们可以通过 pandas 对数据进行筛选,只获取感兴趣的范围,但事实上,我们可以轻松地利用 Plotly 的功能按日期进行筛选。这引出了下一个重要点:如何在图表中添加与日期相关的按钮。

添加按钮

我们可以在图表上添加按钮,以便回溯到过去某个特定时间段。使用 fig.update_xaxes 方法中的 rangeselector 参数来实现。

以下是一些可设置的重要属性:

  • activecolor:选中按钮的背景颜色

  • bgcolor:未点击时按钮的颜色

  • bordercolor:按钮边框的颜色

  • borderwidth:按钮边框的像素宽度

  • buttons:图表上显示的按钮列表。该参数以字典列表的形式传入,每个字典代表一个按钮。在字典中,可以配置关键键值,如 count(步长周期的数量)、label(按钮上显示的文本)和 step(时间单位,支持 "month" | "year" | "day" | "hour" | "minute" | "second" | "all")。此外还有 stepmode 属性,用于设置为 "todate" 或 "backward"。

  • "backward":如果滑块当前位于 2023 年 3 月 3 日,用户点击“1M”按钮,则滑块将移动到 2023 年 2 月 3 日。

  • "todate":如果图表显示的数据截止到 2022 年 2 月 3 日,用户点击“年初至今”按钮,则滑块将移动到 2022 年 1 月 1 日,而不是 2021 年 2 月 3 日。

在下面的代码中,我们设置了多种用途各异的按钮:

1# 导入库 2import pandas as pd 3import numpy as np 4import plotly.express as px 5import plotly.graph_objects as go 6from plotly.subplots import make_subplots 7 8# 导入数据集 9alibaba = pd.read_csv('/usr/local/csvfiles//alibaba.csv', parse_dates=['Date']) 10 11# 创建轨迹并添加 12# 压缩代码,因为逻辑未变 13trace1 = go.Scatter(x=alibaba['Date'], y=alibaba['Open'], 14 marker=dict(color='#7F00FF'), name='开盘价', mode='lines') 15trace2 = go.Scatter(x=alibaba['Date'], y=alibaba['Close'], 16 marker=dict(color='black'), name='收盘价', mode='lines') 17fig = go.Figure(data=[trace1, trace2]) 18fig.update_layout(title=go.layout.Title(text='阿里巴巴股票价格', x=0.5, xref='paper')) 19 20# 新增代码!创建按钮 21fig.update_xaxes( 22 rangeslider_visible=False, 23 rangeselector=dict( 24 activecolor='lightgray', 25 bgcolor='white', 26 bordercolor='black', 27 borderwidth=1, 28 buttons=list([ 29 dict(count=3, label="3D", step="day", stepmode="backward"), # 3天 30 dict(count=7, label="1W", step="day", stepmode="backward"), # 7天 = 1周 31 dict(count=1, label="1M", step="month", stepmode="backward"), # 1个月 32 dict(count=3, label="3M", step="month", stepmode="backward"), # 3个月 33 dict(count=6, label="6M", step="month", stepmode="backward"), # 6个月 34 dict(count=9, label="9M", step="month", stepmode="backward"), # 9个月 35 dict(count=1, label="年初至今", step="year", stepmode="todate"), # 年初至今 36 dict(count=1, label="1Y", step="year", stepmode="backward"), # 1年 37 dict(count=3, label="3Y", step="year", stepmode="backward"), # 3年 38 dict(step="all") # 显示全部可用数据 39 ]), 40 font=dict(color='black', family='Arial', size=14) 41 ) 42) 43 44fig.show()

如图所示,通过切换这些按钮,可以快速以交互方式过滤数据,而无需对数据集进行子集划分。

这是本节课所用所有代码练习的笔记本:

Dash 布局

练习:折线图上的数据按钮