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

如何绘制含可变数量股票价格的DataFrame对数图?

问题描述

我有一个包含1-10只股票价格的DataFrame,需要将所有股票的价格绘制在同一个图表中,X轴为日期,Y轴为股价。要求代码能自动适配股票数量的变化(比如新增第4、5只股票),并且图表为对数图。

样本DataFrame生成代码与数据

生成代码

df = pd.DataFrame(all_Assets)
df2 = df.transpose()
print(df2)

输出的DataFrame数据

Close       Close       Close
Date                                                         
2018-12-12 00:00:00-05:00   40.802803   24.440001  104.500526
2018-12-13 00:00:00-05:00   41.249191   25.119333  104.854965
2018-12-14 00:00:00-05:00   39.929325   24.380667  101.578560
2018-12-17 00:00:00-05:00   39.557732   23.228001   98.570381
2018-12-18 00:00:00-05:00   40.071678   22.468666   99.605057

无法正常运行的代码

fig = go.Figure(data=go.Scatter(df2, mode='lines'),)

解决方案

原代码无法运行的原因是go.Scatter不能直接接收整个DataFrame作为参数,需要为每只股票单独指定x(日期)和y(股价)数据。以下是两种能自动适配股票数量的实现方式:

方法一:Plotly Express(简洁推荐)

Plotly Express会自动遍历DataFrame的所有列生成折线,无需手动添加每条轨迹,新增股票时直接运行代码即可:

import plotly.express as px

# 重命名重复的列名(可选,但图例更清晰)
df2.columns = [f'股票{i+1}' for i in range(len(df2.columns))]

# 绘制折线图,开启对数Y轴
fig = px.line(df2, x=df2.index, y=df2.columns, log_y=True)

# 自定义布局
fig.update_layout(
    xaxis_title='日期',
    yaxis_title='股价(对数)',
    title='多只股票价格走势(对数图)'
)

fig.show()

方法二:Plotly Graph Objects(自定义性更强)

通过循环遍历DataFrame的每一列,动态添加折线轨迹,适合需要更精细自定义图表的场景:

import plotly.graph_objects as go

# 初始化图表对象
fig = go.Figure()

# 遍历每一列,为每只股票添加折线
for idx, col in enumerate(df2.columns):
    fig.add_trace(go.Scatter(
        x=df2.index,
        y=df2[col],
        mode='lines',
        name=f'股票{idx+1}'  # 设置折线对应的图例名称
    ))

# 开启对数Y轴并设置布局
fig.update_layout(
    xaxis_title='日期',
    yaxis_title='股价(对数)',
    title='多只股票价格走势(对数图)',
    yaxis_type='log'
)

fig.show()

注意事项

如果DataFrame的列名重复(如示例中的多个Close),建议先重命名列,否则图例无法区分不同股票,导致图表可读性差。

内容的提问来源于stack exchange,提问作者Marc Kch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 09:45:42