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

如何为Plotly分组柱状图中的每个分组设置不同颜色

如何为Plotly分组柱状图中的每个分组设置不同颜色

没问题呀!你遇到的情况是因为Plotly Express默认对宽格式数据的每一列分配一个颜色组,而不是按你需要的行(也就是你的分组)来分配。要实现每个分组的所有柱子统一用同一种颜色、不同分组颜色不同的效果,我们只需要把数据转成长格式,再指定颜色映射到分组就行,具体操作如下:

步骤1:把宽格式数据转成长格式

你的原始数据是宽格式(每行对应一个分组,每列是该分组下的重复测量值),我们用pd.melt()把它转成长格式,让Plotly能识别分组作为颜色的维度:

import plotly.express as px
import pandas as pd

# 原始数据
data_media_pH = pd.DataFrame(
    [[8.33, 8.36, 8.36], [8.21, 8.18, 8.21], [7.50, 7.56, 7.64]],
    index=["4 °C", "37 °C", "37 °C + 5 % CO₂"]
)

# 转成长格式:拆分数据并标记分组、样本序号
data_long = data_media_pH.reset_index().melt(
    id_vars='index', 
    var_name='sample',  # 标记每个分组内的第几个样本
    value_name='pH'
).rename(columns={'index': 'group'})  # 把原索引列重命名为分组列

步骤2:绘制分组柱状图并按分组设置颜色

用长格式数据绘图时,指定color='group',这样每个分组的所有柱子会自动使用同一种颜色,配合barmode="group"保持分组排列的效果:

fig_media_pH = px.bar(
    data_long,
    x='group',
    y='pH',
    color='group',  # 按分组分配颜色
    barmode="group",
    # 也可以自定义分组颜色,列表颜色会和分组顺序一一对应
    color_discrete_sequence=["#1f77b4", "#ff7f0e", "#2ca02c"]
)

# 调整布局,和你原来的设置保持一致
fig_media_pH = fig_media_pH.update_layout(
    showlegend=False,  # 不需要图例,分组已经在x轴显示
    xaxis_title_text=None,
    yaxis_title_text="pH",
    width=900,
    height=800,
    margin=dict(t=0, b=0, l=0, r=0),
    yaxis_range=(6.5, 8.6)
)

fig_media_pH.show()

为什么这个方法能解决问题?

转成长格式后,Plotly会把每个分组的所有测量值关联到同一个颜色维度(color='group'),而不是像原来的宽格式那样,把每一列的测量值作为独立的颜色维度。这样每个分组内的所有柱子就会共享同一种颜色,不同分组的颜色也会自动区分开。如果想要自定义具体颜色,直接修改color_discrete_sequence里的颜色值就可以了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 11:09:30