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
相关产品推荐
相关产品推荐

