Plotly图表X轴日期显示异常:适配《Python金融Cookbook》2020版
解决Plotly更新后无法复现共享X轴股票时间序列图表的问题
我明白你遇到的困扰——Packt那本《Python For Finance Cookbook》里的代码因为Plotly版本更新,导致X轴显示成了天数计数而不是日期,还没法复现预期的共享X轴图表。我之前也踩过类似的版本兼容坑,给你整理了修复后的方案:
关键问题分析
原来的代码没有显式指定X轴为日期索引,Plotly新版本会默认把DataFrame的索引当作数值型数据(也就是从起始日期开始的天数计数),而不是时间序列。我们需要手动告诉Plotly这是日期数据,同时优化子图的布局和可读性。
修复后的完整代码
import pandas as pd import yfinance as yf import numpy as np import cufflinks as cf from plotly.offline import iplot, init_notebook_mode import plotly.graph_objects as go import plotly.express as px from plotly.subplots import make_subplots init_notebook_mode() # 下载数据并预处理 df = yf.download('MSFT', auto_adjust=False, progress=False) df = df.loc[:, ['Adj Close']] df.rename(columns={'Adj Close': 'adj_close'}, inplace=True) df['simple_rtn'] = df.adj_close.pct_change() df['log_rtn'] = np.log(df.adj_close / df.adj_close.shift(1)) df.dropna(how='any', inplace=True) # 创建共享X轴的子图 fig = make_subplots( rows=3, cols=1, shared_xaxes=True, vertical_spacing=0.05, subplot_titles=("MSFT Adjusted Close Price", "Simple Returns", "Log Returns") # 添加子图标题 ) # 添加每个子图的轨迹,显式指定x为日期索引 fig.add_trace( go.Scatter(x=df.index, y=df['adj_close'], name='Adj Close'), row=1, col=1 ) fig.add_trace( go.Scatter(x=df.index, y=df['simple_rtn'], name='Simple Returns'), row=2, col=1 ) fig.add_trace( go.Scatter(x=df.index, y=df['log_rtn'], name='Log Returns'), row=3, col=1 ) # 布局调整:设置X轴为日期类型,优化显示 fig.update_layout( height=800, # 调整图表高度 title_text="MSFT Time Series Analysis", xaxis=dict(type='date', tickformat='%Y', showgrid=True), # 设置X轴显示年份 xaxis3=dict(type='date', tickformat='%Y', showgrid=True), # 确保第三个子图的X轴也是日期类型 showlegend=False # 关闭图例(如果不需要的话,也可以保留) ) # 更新Y轴标签 fig.update_yaxes(title_text="Price (USD)", row=1, col=1) fig.update_yaxes(title_text="Return", row=2, col=1) fig.update_yaxes(title_text="Log Return", row=3, col=1) # 显示图表 iplot(fig)
核心修改点说明
- 显式传递X轴数据:在
go.Scatter中添加x=df.index,让Plotly识别这是日期时间序列,而不是数值计数 - 设置X轴类型为日期:通过
xaxis=dict(type='date')强制X轴按时间格式渲染,tickformat='%Y'指定显示年份 - 优化子图布局:添加子图标题、Y轴标签,调整垂直间距和图表高度,让可视化更清晰
- 共享X轴生效:确保所有子图的X轴都继承时间序列属性,滚动或缩放时同步联动
这样修改后,你就能得到三个共享X轴(显示年份)的折线图,完美复现书中的预期效果啦。
内容的提问来源于stack exchange,提问作者JakeGehri
相关产品推荐
相关产品推荐

