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

Plotly调用make_subplots组合px图表时格式错乱如何解决

问题原因

你的代码存在两个核心错误,导致子图样式错乱、内容缺失:

  • 每个分组的单图由px.line按method字段生成了4条轨迹(对应A/B/C/D四个方法),但你只追加了figure.data[0]即第一条轨迹,剩余3条轨迹完全没有添加到总图表中
  • 直接提取轨迹追加的方式,不会同步Plotly Express自动生成的样式配置(包括颜色映射、坐标轴标题、线条+标记点样式、图例关联等),同时你没有将单图的坐标轴配置映射到子图对应的坐标轴上
修复方案

不要只取单图的第一条轨迹,需要遍历单图的所有轨迹追加到对应子图位置,同时同步单图的坐标轴配置到总图表的对应子图坐标轴。如果不需要额外自定义,也可以直接用facet参数快速生成分面图,完全保留px原生样式。

方法1:保留make_subplots逻辑,手动追加所有轨迹和配置

修正后的代码如下:

import plotly.graph_objects as go
from plotly.subplots import make_subplots
import plotly.express as px
import pandas as pd
import os

for sequence in sequences:
    # 预处理生成sequence_profile的逻辑保持不变
    sequence_df = pd.DataFrame(sequence_profile)
    groups = sequence_df["group"].unique()
    # 总图表初始化放在分组循环外,按实际分组数量定义子图行数
    grand_figure = make_subplots(
        rows=len(groups), 
        cols=1, 
        subplot_titles=[f"{sequence} Profile Plot - {g}" for g in groups]
    )
    
    for row_idx, group in enumerate(groups, start=1):
        figure_df_group = sequence_df[sequence_df["group"]==group].sort_values("sample", ascending=True)
        # 生成单图,直接在px参数中开启标记点,减少后续update操作
        fig_single = px.line(
            figure_df_group, 
            x="sample", 
            y="intensity", 
            color="method",
            markers=True
        )
        # 把单图的所有轨迹追加到对应子图,而非只取第一条
        for trace in fig_single.data:
            grand_figure.add_trace(trace, row=row_idx, col=1)
        # 同步坐标轴配置到当前子图
        grand_figure.update_xaxes(title_text="sample", row=row_idx, col=1)
        grand_figure.update_yaxes(title_text="intensity", row=row_idx, col=1)
        
        # 保存单图的逻辑保持不变,修正os.path.join的路径拼接写法
        fig_single.write_image(os.path.join(output_directory, f"{sequence}_profile_plot_subplots_in_{group}.jpg"))
    
    # 统一更新总图表布局,自动适配高度避免子图挤压
    grand_figure.update_layout(
        height=300*len(groups),
        title_text=f"{sequence} Profile Plot",
        legend_title_text="method"
    )
    grand_figure.write_image(os.path.join(output_directory, f"grand_figure_{sequence}_profile_plot_subplots.jpg"))

方法2:直接用Plotly Express的facet参数生成分面图(更简单,样式100%保留)

如果你不需要对子图做高度自定义的布局调整,完全不需要手动调用make_subplots,直接在px.line里指定分面参数即可,自动生成纵向排列的子图,所有px原生样式都会完整保留:

for sequence in sequences:
    sequence_df = pd.DataFrame(sequence_profile).sort_values("sample", ascending=True)
    grand_figure = px.line(
        sequence_df,
        x="sample",
        y="intensity",
        color="method",
        facet_row="group", # 按group字段纵向分面
        markers=True,
        title=f"{sequence} Profile Plot"
    )
    # 按需调整总高度即可
    grand_figure.update_layout(height=1200)
    grand_figure.write_image(os.path.join(output_directory, f"grand_figure_{sequence}_profile_plot_subplots.jpg"))
注意事项
  • 方法1完全兼容你现有的代码逻辑,每个子图的样式和你之前生成的单图完全一致,4个子图纵向排列
  • 方法2代码量更少,不需要手动循环追加轨迹,是Plotly官方推荐的分面图实现方式,不会出现样式丢失问题
  • 如果追加轨迹后出现图例重复的问题,在add_trace时给非第一行子图的轨迹加上showlegend=False参数即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 23:33:30