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

Plotly折线图按content列设颜色/符号时线条断开仅显示点的问题

问题解决:Plotly折线图按content分组后无法连续连线

问题背景

现有如下结构的DataFrame:

import pandas as pd

data = {'content': {175: pd.NA,
  176: pd.NA,
  177: 'Address not Found',
  178: 'Delivery delayed-transport issues',
  179: pd.NA,
  180: 'Parcel returned',
  181: 'Parcel lost in mail',
  182: 'Parcel received',
  183: 'Return requested',
  184: 'Repeat order placed'},
 'sales': {175: 7.0,
  176: 7.0,
  177: 9.0,
  178: 13.0,
  179: 11.0,
  180: 9.0,
  181: 19.0,
  182: 14.0,
  183: 9.0,
  184: 9.0},
 'order_date': {175: pd.Timestamp('2019-08-28 16:30:00'),
  176: pd.Timestamp('2019-08-30 11:55:53'),
  177: pd.Timestamp('2019-09-06 14:51:14'),
  178: pd.Timestamp('2019-09-06 15:03:22'),
  179: pd.Timestamp('2019-09-06 15:46:11'),
  180: pd.Timestamp('2019-09-06 16:08:03'),
  181: pd.Timestamp('2019-09-06 17:13:01'),
  182: pd.Timestamp('2019-09-16 21:38:29'),
  183: pd.Timestamp('2019-09-25 12:35:29'),
  184: pd.Timestamp('2019-09-25 22:22:51')}}

df = pd.DataFrame(data)

尝试用以下代码绘制折线图,将content设为color和symbol参数:

fig = px.line(df, x='order_date', y='sales',color='content',symbol='content', color_discrete_sequence=px.colors.qualitative.Pastel,
              markers=True, line_shape='hvh')

结果出现每个content对应单独线条,部分仅显示点未连接的问题,替换NaN为None后问题仍存在。

原因分析

Plotly的px.line会根据color/symbol参数对数据分组,每个分组单独绘制线条。由于大部分content类别仅对应单个数据点,且NaN/None会被视为独立分组(或直接忽略),导致无法形成连续连线。

解决方法

方法一:填充NaN为统一类别,保持全数据连线

将content列的空值替换为一个统一的类别(如"无状态"),让所有数据点归属于某个分组,从而形成连续线条:

# 填充空值
df['content'] = df['content'].fillna('无状态')

# 绘制折线图
fig = px.line(df, x='order_date', y='sales', color='content', symbol='content', 
              color_discrete_sequence=px.colors.qualitative.Pastel,
              markers=True, line_shape='hvh')

fig.show()

这种方法会让整个折线按content分组显示,包括空值对应的线段。

方法二:绘制整体折线,叠加分类标记点

先绘制一条完整的折线,再为不同content的点添加标记,既保持线条连续,又区分不同状态:

import plotly.express as px

# 绘制基础折线
fig = px.line(df, x='order_date', y='sales', line_shape='hvh', 
              color_discrete_sequence=['gray'], name='销售趋势')

# 为每个非空content添加标记点
for content in df['content'].dropna().unique():
    subset = df[df['content'] == content]
    fig.add_scatter(x=subset['order_date'], y=subset['sales'], mode='markers', 
                    marker_symbol='circle', marker_size=10,
                    name=content, legendgroup=content)

fig.update_layout(showlegend=True)
fig.show()

这种方法的优势是折线始终连续,仅用标记突出显示有状态的节点。

内容的提问来源于stack exchange,提问作者Irene Hawkins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:05:40