如何叠加不同日期的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
相关产品推荐
相关产品推荐

