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

Plotly分组堆叠柱状图:基于DataFrame列设置颜色与透明度

问题:Plotly分组堆叠柱状图中为指定组设置透明度区分并列组?

我正在使用Plotly绘制分组堆叠柱状图,已为各plot_label类别配置了颜色字典colour_dict,但希望区分Actual和Projected组,为其中一组设置不同的透明度。现有数据结构及绘图代码如下:

数据结构

year    subplot  plot_label   value
0     2019  Projected  Category 1   3.1
1     2020  Projected  Category 1   3.0
2     2021  Projected  Category 1   2.8
3     2019  Projected  Category 2   3.1
4     2020  Projected  Category 2   3.0
5     2021  Projected  Category 2   2.8
6     2019     Actual  Category 1   3.1
7     2020     Actual  Category 1   3.0
8     2021     Actual  Category 1   2.8
9     2019     Actual  Category 2   3.1
10    2020     Actual  Category 2   3.0
11    2021     Actual  Category 2   2.8

当前绘图代码

colour_dict = {'Category 1': '#123', 'Category 2': '#456'}

fig = px.bar(df, x='subplot', y='value', facet_col='year', color='plot_label',
             facet_col_spacing=0.01, color_discrete_map=colour_dict)

当前Actual和Projected组的颜色基于plot_label类别一致,请问能否为其中一组调整透明度以区分并列柱状图?


解决方案

完全可以实现。Plotly Express没有直接提供按subplot分组设置透明度的参数,但可以通过修改生成图表的trace属性来完成,具体步骤如下:

  1. 先运行现有代码生成基础图表;
  2. 遍历图表的所有trace,根据trace对应的subplot分组,为目标组设置opacity(透明度)属性。

示例代码

colour_dict = {'Category 1': '#123', 'Category 2': '#456'}

fig = px.bar(df, x='subplot', y='value', facet_col='year', color='plot_label',
             facet_col_spacing=0.01, color_discrete_map=colour_dict)

# 遍历所有trace,为Projected组设置透明度(0-1取值,值越小越透明)
for trace in fig.data:
    # 每个trace的x轴数据全部属于同一个subplot,取第一个元素判断分组
    if trace.x[0] == 'Projected':
        trace.opacity = 0.6
    # 若需要也可给Actual组单独设置,比如 else: trace.opacity = 1.0

fig.show()

说明

  • 每个trace对应一个plot_label在某年份子图中的数据,其x属性的所有元素都属于同一个subplot(Actual或Projected),因此取第一个元素即可判断所属分组;
  • 调整opacity的值控制透明度,比如0.6表示60%不透明度,能有效区分两组数据;
  • 如果后续图表结构有变化,可通过trace的自定义数据或其他属性判断分组,但当前数据结构下上述方法完全适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:11:22