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

如何叠加不同日期的Plotly折线图?现有代码优化需求

问题描述

需要叠加两个不同日期的折线图,将不同日期的VALUE1和VALUE2曲线展示在同一图表中,但现有基于Python、Pandas和Plotly的代码未实现预期效果。

现有代码:

import random
import pandas as pd
import numpy as np
import plotly.express as px

df = pd.DataFrame({'DATE_TIME':pd.date_range('2022-11-01', '2022-11-06 23:00:00',freq='20min'),
                   'ID':[random.randrange(1, 20) for n in range(430)]})
df['VALUE1'] = [random.uniform(110, 160) for n in range(430)]
df['VALUE2'] = [random.uniform(50, 80) for n in range(430)]
df['INSPECTION'] = df['DATE_TIME'].dt.day

df['MODE'] = np.select([df['INSPECTION']==1, df['INSPECTION'].isin([2,3])], ['A', 'B'], 'C')
#print(df)
machine15 = df[df.ID==15]
machine15_inspection_1 = machine15[machine15.INSPECTION==1]
machine15_inspection_2 = machine15[machine15.INSPECTION==2]


fig1 = px.line(machine15_inspection_1, x="DATE_TIME", y=["VALUE1","VALUE2"], facet_col='INSPECTION',
                         facet_row_spacing=0.1,
                         facet_col_spacing=0.09,
                         markers=True)

fig2 = px.line(machine15_inspection_2, x="DATE_TIME", y=["VALUE1","VALUE2"],facet_col='INSPECTION',
                         facet_row_spacing=0.1,
                         facet_col_spacing=0.09,
                         markers=True)

fig2.update_traces(opacity=0.6)
fig1.add_traces(
    list(fig2.select_traces())
)
fig1.update_xaxes(matches=None, showticklabels=True)

fig1.show()
解决方案

原代码核心问题是使用了facet_col='INSPECTION',导致两个图表生成了独立的分面子图,添加轨迹时会默认对应到各自分面,无法实现同一画布的叠加。下面提供两种可行修改方案:

方法1:合并数据集统一绘图

将两个日期的数据合并,转换为长表格式后,用color区分日期、line_dash区分指标,让Plotly自动生成叠加曲线:

import random
import pandas as pd
import numpy as np
import plotly.express as px

# 生成原始数据
df = pd.DataFrame({'DATE_TIME':pd.date_range('2022-11-01', '2022-11-06 23:00:00',freq='20min'),
                   'ID':[random.randrange(1, 20) for n in range(430)]})
df['VALUE1'] = [random.uniform(110, 160) for n in range(430)]
df['VALUE2'] = [random.uniform(50, 80) for n in range(430)]
df['INSPECTION'] = df['DATE_TIME'].dt.day
df['MODE'] = np.select([df['INSPECTION']==1, df['INSPECTION'].isin([2,3])], ['A', 'B'], 'C')

# 筛选目标机器和指定日期的数据
machine15 = df[df.ID==15]
target_data = machine15[machine15.INSPECTION.isin([1,2])]

# 转换为长表格式,方便统一绘图
long_data = target_data.melt(
    id_vars=['DATE_TIME', 'INSPECTION'],
    value_vars=['VALUE1', 'VALUE2'],
    var_name='指标',
    value_name='数值'
)

# 绘制叠加折线图
fig = px.line(
    long_data,
    x="DATE_TIME",
    y="数值",
    color='INSPECTION',
    line_dash='指标',
    markers=True,
    opacity=0.8
)
fig.update_layout(title='机器15不同日期的VALUE1/VALUE2曲线叠加')
fig.show()

方法2:手动添加轨迹到同一画布

移除facet_col参数,让两个图表都生成在同一画布,再手动合并轨迹并修改名称避免混淆:

import random
import pandas as pd
import numpy as np
import plotly.express as px

# 生成原始数据
df = pd.DataFrame({'DATE_TIME':pd.date_range('2022-11-01', '2022-11-06 23:00:00',freq='20min'),
                   'ID':[random.randrange(1, 20) for n in range(430)]})
df['VALUE1'] = [random.uniform(110, 160) for n in range(430)]
df['VALUE2'] = [random.uniform(50, 80) for n in range(430)]
df['INSPECTION'] = df['DATE_TIME'].dt.day
df['MODE'] = np.select([df['INSPECTION']==1, df['INSPECTION'].isin([2,3])], ['A', 'B'], 'C')

# 筛选目标机器和日期的数据
machine15 = df[df.ID==15]
inspection_1 = machine15[machine15.INSPECTION==1]
inspection_2 = machine15[machine15.INSPECTION==2]

# 生成无分面的基础图表
fig1 = px.line(
    inspection_1,
    x="DATE_TIME",
    y=["VALUE1","VALUE2"],
    markers=True,
    labels={'value':'数值', 'variable':'指标'}
)
# 修改轨迹名称,标注日期
for trace in fig1.data:
    trace.name = f"{trace.name} (11月1日)"

# 生成第二个日期的图表
fig2 = px.line(
    inspection_2,
    x="DATE_TIME",
    y=["VALUE1","VALUE2"],
    markers=True,
    labels={'value':'数值', 'variable':'指标'}
)
# 修改轨迹名称并设置透明度
for trace in fig2.data:
    trace.name = f"{trace.name} (11月2日)"
    trace.opacity = 0.6

# 将fig2的轨迹添加到fig1
fig1.add_traces(list(fig2.select_traces()))
fig1.update_layout(title='机器15不同日期的VALUE1/VALUE2曲线叠加')
fig1.show()

关键说明

  • 必须移除原代码中的facet_col='INSPECTION',否则生成的分面子图会阻碍轨迹叠加。
  • 合并数据集的方法更简洁,Plotly会自动处理图例和样式区分;手动添加轨迹的方式更灵活,适合需要精细控制单条曲线样式的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 10:15:54