如何实现Plotly多子图中训练前后数据系列颜色统一?
Plotly多子图系列颜色统一方案
问题
用Plotly制作健身训练前后对比的多子图时,各子图内“训练前”和“训练后”系列颜色不统一,导致对比不直观。现有代码如下:
fig = make_subplots( rows=3, cols=2, specs = [[{'colspan':2}, None], [{},{}], [{},{}]], subplot_titles=("Body Mass", "Active Energy Burned", "Basal Energy Burned", "Distance Walking-Running", "Step Count")) #Body Mass Chart fig.add_trace(go.Scatter(x=record_data_df_dict["BodyMass"]["Date"], y=record_data_df_dict["BodyMass"]["BodyMass"], name = "Before Workout Routine"), row=1, col=1) fig.add_trace(go.Scatter(x=record_data_df_BodyMass_start_Sep22["Date"], y=record_data_df_BodyMass_start_Sep22["BodyMass"], name = "After Workout Routine"), row=1, col=1) # Active Energy Burned Chart fig.add_trace(go.Bar(x=record_data_df_ActiveEnergyBurned_before_workout["Date"], y=record_data_df_ActiveEnergyBurned_before_workout["ActiveEnergyBurned"], name = "Before Workout Routine"), row=2, col=1) fig.add_trace(go.Bar(x=record_data_df_ActiveEnergyBurned_after_workout["Date"], y=record_data_df_ActiveEnergyBurned_after_workout["ActiveEnergyBurned"], name = "After Workout Routine"), row=2, col=1) # Basal Energy Burned Chart fig.add_trace(go.Bar(x=record_data_df_BasalEnergyBurned_before_workout["Date"], y=record_data_df_BasalEnergyBurned_before_workout["BasalEnergyBurned"], name = "Before Workout Routine"), row=2, col=2) fig.add_trace(go.Bar(x=record_data_df_BasalEnergyBurned_after_workout["Date"], y=record_data_df_BasalEnergyBurned_after_workout["BasalEnergyBurned"], name = "After Workout Routine"), row=2, col=2) # Distance Chart fig.add_trace(go.Bar(x=record_data_df_Distance_before_workout["Date"], y=record_data_df_Distance_before_workout["DistanceWalkingRunning"], name = "Before Workout Routine"), row=3, col=1) fig.add_trace(go.Bar(x=record_data_df_Distance_after_workout["Date"], y=record_data_df_Distance_after_workout["DistanceWalkingRunning"], name = "After Workout Routine"), row=3, col=1) # Step Chart fig.add_trace(go.Bar(x=record_data_df_StepCount_before_workout["Date"], y=record_data_df_StepCount_before_workout["StepCount"], name = "Before Workout Routine"), row=3, col=2) fig.add_trace(go.Bar(x=record_data_df_StepCount_after_workout["Date"], y=record_data_df_StepCount_after_workout["StepCount"], name = "After Workout Routine"), row=3, col=2) fig.update_layout(height=800, width=600, showlegend=False, title_text="Before vs After Workout") fig.show()
生成的图表中,不同子图的“训练前”“训练后”系列颜色不一致,比如第一个折线图的训练前是蓝色,第二个柱状图的训练前可能是橙色,影响对比效果。
解决方案
方法1:手动指定固定颜色(最可靠)
提前定义两个颜色变量,给每个“训练前”和“训练后”的trace分别指定颜色:折线图用line_color参数,柱状图用marker_color参数。修改后的代码如下:
# 定义统一颜色(可替换为任意你喜欢的十六进制颜色码) BEFORE_COLOR = '#1f77b4' AFTER_COLOR = '#ff7f0e' fig = make_subplots( rows=3, cols=2, specs = [[{'colspan':2}, None], [{},{}], [{},{}]], subplot_titles=("体重", "活动消耗热量", "基础消耗热量", "步行跑步距离", "步数")) # 体重图表(折线图) fig.add_trace(go.Scatter( x=record_data_df_dict["BodyMass"]["Date"], y=record_data_df_dict["BodyMass"]["BodyMass"], name = "训练前", line_color=BEFORE_COLOR ), row=1, col=1) fig.add_trace(go.Scatter( x=record_data_df_BodyMass_start_Sep22["Date"], y=record_data_df_BodyMass_start_Sep22["BodyMass"], name = "训练后", line_color=AFTER_COLOR ), row=1, col=1) # 活动消耗热量(柱状图) fig.add_trace(go.Bar( x=record_data_df_ActiveEnergyBurned_before_workout["Date"], y=record_data_df_ActiveEnergyBurned_before_workout["ActiveEnergyBurned"], name = "训练前", marker_color=BEFORE_COLOR ), row=2, col=1) fig.add_trace(go.Bar( x=record_data_df_ActiveEnergyBurned_after_workout["Date"], y=record_data_df_ActiveEnergyBurned_after_workout["ActiveEnergyBurned"], name = "训练后", marker_color=AFTER_COLOR ), row=2, col=1) # 基础消耗热量 fig.add_trace(go.Bar( x=record_data_df_BasalEnergyBurned_before_workout["Date"], y=record_data_df_BasalEnergyBurned_before_workout["BasalEnergyBurned"], name = "训练前", marker_color=BEFORE_COLOR ), row=2, col=2) fig.add_trace(go.Bar( x=record_data_df_BasalEnergyBurned_after_workout["Date"], y=record_data_df_BasalEnergyBurned_after_workout["BasalEnergyBurned"], name = "训练后", marker_color=AFTER_COLOR ), row=2, col=2) # 步行跑步距离 fig.add_trace(go.Bar( x=record_data_df_Distance_before_workout["Date"], y=record_data_df_Distance_before_workout["DistanceWalkingRunning"], name = "训练前", marker_color=BEFORE_COLOR ), row=3, col=1) fig.add_trace(go.Bar( x=record_data_df_Distance_after_workout["Date"], y=record_data_df_Distance_after_workout["DistanceWalkingRunning"], name = "训练后", marker_color=AFTER_COLOR ), row=3, col=1) # 步数 fig.add_trace(go.Bar( x=record_data_df_StepCount_before_workout["Date"], y=record_data_df_StepCount_before_workout["StepCount"], name = "训练前", marker_color=BEFORE_COLOR ), row=3, col=2) fig.add_trace(go.Bar( x=record_data_df_StepCount_after_workout["Date"], y=record_data_df_StepCount_after_workout["StepCount"], name = "训练后", marker_color=AFTER_COLOR ), row=3, col=2) fig.update_layout(height=800, width=600, showlegend=False, title_text="训练前后对比") fig.show()
方法2:利用同名系列自动匹配颜色(简洁但有局限)
Plotly会为完全同名的trace自动分配相同颜色,但如果子图混合了不同类型的trace(比如折线和柱状),可能会出现颜色不统一的情况。如果你的子图类型一致,可直接保证所有“训练前”和“训练后”的name参数完全相同即可。
由于你当前的子图包含折线和柱状两种类型,方法1的手动指定颜色更稳妥,不会出现意外问题。
内容的提问来源于stack exchange,提问作者puyocode
相关产品推荐
相关产品推荐

