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

Plotly绘制DataFrame中多笔股票交易连线的问题排查

问题分析与解决方案

先从你的代码里拆解几个核心问题:

1. DataFrame 创建的基础错误

你提供的df2初始化代码有两个致命问题:

  • 时间字符串没有加引号(比如10:00应该写成'10:00'),Python会把10:00当成语法错误的表达式
  • 数组维度不匹配:你的np.array是4行3列,但columns定义了4个字段,应该是3行4列(对应3笔交易,每笔4个属性),否则会直接报错。

正确的DataFrame创建方式应该是:

import pandas as pd
import numpy as np
import plotly.graph_objects as go

# 修正后的DataFrame:3笔交易,每笔4个字段
df2 = pd.DataFrame(
    np.array([
        ['10:00', '10:03', 67093, 67095],
        ['11:00', '11:07', 67010, 67012],
        ['12:00', '12:09', 66000, 66010]
    ]),
    columns=['time_opened', 'time_closed', 'level_opened', 'level_closed']
)
# 还要把价位列转换成数值类型(因为np.array会统一成字符串类型)
df2[['level_opened', 'level_closed']] = df2[['level_opened', 'level_closed']].astype(int)
# 把时间列转换成datetime类型,方便plotly识别
df2['time_opened'] = pd.to_datetime(df2['time_opened'], format='%H:%M')
df2['time_closed'] = pd.to_datetime(df2['time_closed'], format='%H:%M')

2. Plotly add_shape 的使用错误

你的fig.add_shape()代码有两个关键问题:

  • add_shape()一次只能添加单条线条,不能直接传入整个Series(比如positions['time_opened']是Series对象),plotly无法批量解析这种输入,必须通过循环遍历每一笔交易来添加线条
  • xaxis='x1'是指定使用第二个x轴,但你并没有定义x1轴,应该改为默认的xaxis='x'(或者省略不写,默认就是x轴)

3. 时间轴的解析问题

如果不把时间字符串转换成datetime类型,plotly会把x轴当成字符串轴,无法正确按时间顺序排列,也会导致线条的位置错乱。


完整的修正代码

import pandas as pd
import numpy as np
import plotly.graph_objects as go

# 1. 正确创建并预处理数据
df2 = pd.DataFrame(
    np.array([
        ['10:00', '10:03', 67093, 67095],
        ['11:00', '11:07', 67010, 67012],
        ['12:00', '12:09', 66000, 66010]
    ]),
    columns=['time_opened', 'time_closed', 'level_opened', 'level_closed']
)
# 转换价位为数值类型
df2[['level_opened', 'level_closed']] = df2[['level_opened', 'level_closed']].astype(int)
# 转换时间为datetime类型
df2['time_opened'] = pd.to_datetime(df2['time_opened'], format='%H:%M')
df2['time_closed'] = pd.to_datetime(df2['time_closed'], format='%H:%M')

# 2. 创建图表并循环添加每笔交易的线条
fig = go.Figure()

# 遍历每一行,添加单条交易线条
for _, row in df2.iterrows():
    fig.add_shape(
        type='line',
        x0=row['time_opened'],
        y0=row['level_opened'],
        x1=row['time_closed'],
        y1=row['level_closed'],
        line=dict(color='Black', width=3),
        xaxis='x'  # 使用默认x轴
    )

# 可选:添加散点标记,清晰显示开仓/平仓点
fig.add_trace(go.Scatter(
    x=df2['time_opened'],
    y=df2['level_opened'],
    mode='markers',
    marker=dict(color='green', size=8),
    name='开仓点'
))
fig.add_trace(go.Scatter(
    x=df2['time_closed'],
    y=df2['level_closed'],
    mode='markers',
    marker=dict(color='red', size=8),
    name='平仓点'
))

# 配置轴标签和标题
fig.update_layout(
    xaxis_title='时间',
    yaxis_title='股票价位',
    title='每笔股票交易的价位变化连线',
    xaxis=dict(
        tickformat='%H:%M'  # 设置时间显示格式
    )
)

fig.show()

这段代码会生成一张符合你需求的图表:每笔交易对应一条从开仓时间/价位到平仓时间/价位的黑色粗线,同时用绿色标记开仓点、红色标记平仓点,x轴按时间顺序正确排列。

内容的提问来源于stack exchange,提问作者Oliver P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 12:57:35