如何用Plotly绘制带标记标签的多列折线图?
用Plotly创建带标记点标签的清晰折线图
需求实现方案
要实现同时展示两列折线、所有带标签的标记点且保证间距清晰,可通过以下步骤调整代码:
1. 准备数据(补充Value列示例)
假设你的DataFrame包含Date、Percentage Change、Percentage Change From Initial和Value列,先构造示例数据:
import plotly.graph_objects as go import pandas as pd # 构造示例DataFrame(补充Value列) data = { 'Date': ['2023-05-01', '2023-05-02', '2023-05-03', '2023-05-04', '2023-05-05', '2023-05-06'], 'Percentage Change': [0.0, 0.2, -0.083, 0.227, -0.037, 0.154], 'Percentage Change From Initial': [0.0, 0.2, 0.1, 0.35, 0.3, 0.5], 'Value': [100, 120, 110, 135, 130, 150] # 新增示例Value列 } df = pd.DataFrame(data)
2. 创建折线与标记点(显示所有标签)
核心调整:直接使用全量数据生成标记点,通过textposition控制标签位置避免重叠,同时保留折线显示:
# 创建Plotly画布 fig = go.Figure() # 添加「当日涨跌幅」折线+全量标记点(带标签) fig.add_trace(go.Scatter( x=df['Date'], y=df['Percentage Change'], mode='lines+markers+text', # 同时显示折线、标记点、文本标签 name='当日涨跌幅', text=[f'{val:.3f}' for val in df['Percentage Change']], # 格式化标签文本 textposition='top center', # 标签位置:标记点上方居中 marker=dict(size=8), # 标记点大小,保证间距清晰 hovertemplate='当日涨跌幅: %{text}<extra></extra>' )) # 添加「相对初始涨跌幅」折线+全量标记点(带标签) fig.add_trace(go.Scatter( x=df['Date'], y=df['Percentage Change From Initial'], mode='lines+markers+text', name='相对初始涨跌幅', text=[f'{val:.2f}' for val in df['Percentage Change From Initial']], textposition='bottom center', # 标签位置:标记点下方居中,避免与另一系列重叠 marker=dict(size=8), hovertemplate='相对初始涨跌幅: %{text}<extra></extra>' )) # 添加「Value列」带标签的标记点(仅显示标记点和标签,无折线) fig.add_trace(go.Scatter( x=df['Date'], y=df['Value'], mode='markers+text', name='Value', text=df['Value'].astype(str), textposition='right center', # 标签位置:标记点右侧 marker=dict(size=10, color='red'), # 用红色区分该系列 hovertemplate='Value: %{text}<extra></extra>' )) # 调整布局,优化显示 fig.update_layout( title='股票数据走势', xaxis_title='日期', yaxis_title='数值/涨跌幅', legend=dict(orientation='h', yanchor='bottom', y=1.02, xanchor='right', x=1), # 图例放顶部右侧 margin=dict(l=50, r=50, t=80, b=50) # 调整边距避免标签被截断 ) # 显示图表 fig.show()
关键优化点说明
- 全量标记点显示:去掉原代码中按间隔取点的逻辑,直接使用全量数据,确保所有点都展示。
- 标签防重叠:给不同系列设置不同的
textposition(顶部、底部、右侧),避免标签互相遮挡。 - 标记点间距:通过
marker=dict(size=...)控制标记点大小,结合布局边距调整,保证点与点之间间距清晰。 - 文本格式化:格式化标签文本(如保留2-3位小数),提升可读性。
原代码问题说明
你提供的示例代码通过interval间隔取点,仅显示部分标记点;且未直接在图上显示标签(仅hover时可见),不符合「显示所有带标签的标记点」的需求。
原代码输出效果

内容的提问来源于stack exchange,提问作者Bosser445
相关产品推荐
相关产品推荐

