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

如何合并两个Plotly Express堆叠柱状图为单个可视化图表?

合并Plotly堆叠柱状图为单个可视化(类似ggplot风格)

当然可以!我们可以通过Plotly的make_subplots工具将两个物种的RSCU堆叠图和底部的Equality堆叠图合并成一个紧凑的整体可视化,效果完全能对标ggplot的组合图。下面是完整的实现代码和关键步骤解释:

完整实现代码

import pandas as pd
import plotly.express as px
from plotly.subplots import make_subplots

# 1. 读取并预处理数据
rscu1 = pd.read_csv("JQ038231.1_RSCU_stack.csv")
rscu2 = pd.read_csv("MG970255.1_RSCU_stack.csv")
rscu = pd.concat([rscu1, rscu2], keys=["JQ038231", "MG970255"])
rscu["species"] = rscu.index.get_level_values(0)
rscu = rscu.astype({"Fill": "category"})
rscu = rscu.astype({"aaRatio": "object"})

# 2. 创建子图布局:3行垂直排列,共享X轴,控制间距和高度比例
fig = make_subplots(
    rows=3, cols=1,
    shared_xaxes=True,
    vertical_spacing=0.02,  # 缩小子图间距,让整体更紧凑
    row_heights=[0.45, 0.45, 0.1]  # 分配每行高度:两个物种图占比相近,底部图占比小
)

# 3. 添加JQ038231的RSCU堆叠图到第一行子图
fig_jq = px.bar(
    rscu[rscu["species"] == "JQ038231"],
    x="AA", y="RSCU", color="Fill",
    barmode='stack', text="aaRatio", hover_data=['AA', "RSCU"],
    color_discrete_map={1: "#6598c9", 2: "#cb4a28", 3: "#9ac664", 4: "#7f5499"}
)
for trace in fig_jq.data:
    trace.update(width=0.9, textposition='outside')
    fig.add_trace(trace, row=1, col=1)

# 4. 添加MG970255的RSCU堆叠图到第二行子图
fig_mg = px.bar(
    rscu[rscu["species"] == "MG970255"],
    x="AA", y="RSCU", color="Fill",
    barmode='stack', text="aaRatio", hover_data=['AA', "RSCU"],
    color_discrete_map={1: "#6598c9", 2: "#cb4a28", 3: "#9ac664", 4: "#7f5499"}
)
for trace in fig_mg.data:
    trace.update(width=0.9, textposition='outside')
    fig.add_trace(trace, row=2, col=1)

# 5. 添加底部的Equality堆叠图到第三行子图
fig_bottom = px.bar(
    rscu1, x="AA", y="Equality", color="Fill",
    barmode='stack', text="AA", hover_data=['AA'],
    color_discrete_map={1: "#6598c9", 2: "#cb4a28", 3: "#9ac664", 4: "#7f5499"}
)
for trace in fig_bottom.data:
    trace.update(width=0.9, textposition='inside', textfont_size=14)
    fig.add_trace(trace, row=3, col=1)

# 6. 统一调整布局样式
fig.update_layout(
    autosize=False,
    width=950,
    height=670,  # 总高度适配比例
    showlegend=False,
    uniformtext_minsize=8,
    uniformtext_mode='show',
    plot_bgcolor="rgba(0, 0, 0, 0)",
    paper_bgcolor="rgba(0, 0, 0, 0)"
)

# 7. 调整轴显示:让X轴仅在底部显示,Y轴按需展示
fig.update_xaxes(tickangle=0, ticks="outside", title=None, row=3, col=1)
fig.update_xaxes(showticklabels=False, title=None, row=1, col=1)
fig.update_xaxes(showticklabels=False, title=None, row=2, col=1)

fig.update_yaxes(title_text="RSCU", row=1, col=1)
fig.update_yaxes(title_text="RSCU", row=2, col=1)
fig.update_yaxes(title=None, showticklabels=False, row=3, col=1)

# 8. 添加物种标签(替代原facet的标题)
fig.add_annotation(
    text="JQ038231", x=0.02, y=0.98,
    xref="paper", yref="paper", showarrow=False, font=dict(size=12)
)
fig.add_annotation(
    text="MG970255", x=0.02, y=0.53,
    xref="paper", yref="paper", showarrow=False, font=dict(size=12)
)

# 显示图表
fig.show()

关键步骤说明

  1. 子图布局创建:用make_subplots手动构建3行垂直布局,通过shared_xaxes=True保证所有子图的X轴完全对齐,vertical_spacing缩小子图间的空白,让整体更像一个连贯的图表。
  2. 轨迹(Trace)迁移:不再使用Plotly Express的facet_row,而是分别为每个物种生成独立的堆叠图,然后将它们的轨迹逐一添加到对应行的子图中,这样能完全控制每个子图的样式和位置。
  3. 样式统一:保持你原有的颜色映射、柱状图宽度、文本位置等样式,确保合并后的图表和原两个图的视觉风格一致。
  4. 轴与标签优化:让X轴仅在最底部显示,两个物种图保留Y轴标签,底部图隐藏Y轴,同时添加物种标签替代原facet的标题,更贴近ggplot的简洁风格。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:47:26