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

如何实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 10:02:34