You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 15:38:04