如何合并两个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()
关键步骤说明
- 子图布局创建:用
make_subplots手动构建3行垂直布局,通过shared_xaxes=True保证所有子图的X轴完全对齐,vertical_spacing缩小子图间的空白,让整体更像一个连贯的图表。 - 轨迹(Trace)迁移:不再使用Plotly Express的
facet_row,而是分别为每个物种生成独立的堆叠图,然后将它们的轨迹逐一添加到对应行的子图中,这样能完全控制每个子图的样式和位置。 - 样式统一:保持你原有的颜色映射、柱状图宽度、文本位置等样式,确保合并后的图表和原两个图的视觉风格一致。
- 轴与标签优化:让X轴仅在最底部显示,两个物种图保留Y轴标签,底部图隐藏Y轴,同时添加物种标签替代原facet的标题,更贴近ggplot的简洁风格。
内容的提问来源于stack exchange,提问作者Dong Zhang
相关产品推荐
相关产品推荐

