如何将Plotly Express堆叠条形图嵌入子图并按Species区分堆叠项
Plotly子图嵌入px条形图及堆叠颜色匹配解决方案
使用px.data.iris()数据集,通过Plotly Express可以快速生成按species列区分颜色的堆叠条形图,但无法直接将该图表嵌入到make_subplots创建的复合子图中;尝试用Plotly Graph Objects实现时,无法正确按species区分堆叠项颜色,堆叠效果不符合预期。以下是两种可行的解决方法:
方案1:提取Plotly Express生成的图表轨迹(Trace)嵌入子图
Plotly Express生成的图表对象(fig)中包含了所有已配置好的轨迹(fig.data),只需将这些轨迹逐个添加到复合子图中,即可完整保留原有的颜色映射、堆叠逻辑。
示例代码:
import plotly.express as px from plotly.subplots import make_subplots # 预处理数据并生成px条形图 df = px.data.iris() df = df[["sepal_width", "sepal_length", "species"]] df = df[(df["sepal_width"] > 2.7) & (df["sepal_width"] < 3.3)] px_fig = px.bar(df, x="sepal_width", y="sepal_length", color="species") # 初始化复合子图 bigFig = make_subplots( rows=2, cols=2, specs = [ [{"type": "pie"}, {"type": "pie"}], [{"type": "bar"}, {"type": "bar"}], ], subplot_titles=("pie1", "pie2", "bar1", "bar2") ) # 将px生成的所有轨迹添加到指定子图位置 for trace in px_fig.data: bigFig.add_trace(trace, row=2, col=2) # 设置子图的条形堆叠模式 bigFig.update_layout(barmode="stack") bigFig.show()
方案2:用Plotly Graph Objects手动实现匹配效果的堆叠条形图
如果需要直接用Graph Objects构建,需按species分组,为每个类别创建独立的Bar轨迹,并指定与Plotly Express一致的颜色序列,再添加到子图中。
示例代码:
import plotly.graph_objects as go from plotly.subplots import make_subplots import plotly.express as px # 预处理数据 df = px.data.iris() df = df[["sepal_width", "sepal_length", "species"]] df = df[(df["sepal_width"] > 2.7) & (df["sepal_width"] < 3.3)] # 初始化复合子图 bigFig = make_subplots( rows=2, cols=2, specs = [ [{"type": "pie"}, {"type": "pie"}], [{"type": "bar"}, {"type": "bar"}], ], subplot_titles=("pie1", "pie2", "bar1", "bar2") ) # 按species分组创建Bar轨迹,使用px默认定性颜色序列 colors = px.colors.qualitative.Plotly species_list = df["species"].unique() for i, species in enumerate(species_list): species_df = df[df["species"] == species] trace = go.Bar( x=species_df["sepal_width"], y=species_df["sepal_length"], name=species, marker_color=colors[i] ) bigFig.add_trace(trace, row=2, col=2) # 设置堆叠模式并显示 bigFig.update_layout(barmode="stack") bigFig.show()
内容的提问来源于stack exchange,提问作者Tall_Joe
相关产品推荐
相关产品推荐

