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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:50:32