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

如何在Plotly Express的分组柱状图(y为列表)上添加数据标签

解决Plotly Express分组柱状图添加数据标签的问题

当你使用px.bar并传入多列作为y参数时,Plotly会自动将宽格式数据转换为长格式,此时直接传入text=['unweighted', 'weighted_1', 'weighted_2']无法生效——因为长格式下所有数值统一存储在value列中,原列名会转为variable列。以下是两种可行的解决方案:

方法一:使用text_auto自动生成标签

这是最简便的方式,通过text_auto参数自动显示柱子对应的数值,还能自定义数值格式:

import plotly.express as px
import pandas as pd

foo = pd.DataFrame({'country': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'},
 'unweighted': {0: 18.0, 1: 16.9, 2: 13.3, 3: 11.3, 4: 13.1},
 'weighted_1': {0: 17.7, 1: 15.8, 2: 14.0, 3: 11.2, 4: 12.8},
 'weighted_2': {0: 17.8, 1: 15.8, 2: 14.0, 3: 11.2, 4: 12.8}})

px.bar(
    foo,
    x='country',
    y=['unweighted', 'weighted_1', 'weighted_2'],
    barmode='group',
    text_auto=True  # 自动显示数值标签
)

如果需要格式化数值(比如保留1位小数),可修改为:

text_auto='.1f'

方法二:手动转换为长格式数据后指定标签

先将宽格式数据转换为长格式,再明确指定text参数为数值列,这种方式更灵活,支持自定义标签内容:

import plotly.express as px
import pandas as pd

foo = pd.DataFrame({'country': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'},
 'unweighted': {0: 18.0, 1: 16.9, 2: 13.3, 3: 11.3, 4: 13.1},
 'weighted_1': {0: 17.7, 1: 15.8, 2: 14.0, 3: 11.2, 4: 12.8},
 'weighted_2': {0: 17.8, 1: 15.8, 2: 14.0, 3: 11.2, 4: 12.8}})

# 将宽格式转换为长格式
foo_long = foo.melt(id_vars='country', var_name='metric', value_name='value')

px.bar(
    foo_long,
    x='country',
    y='value',
    color='metric',
    barmode='group',
    text='value'  # 指定数值列作为标签
)

若要自定义标签格式(比如保留1位小数),可修改text参数:

text=foo_long['value'].round(1).astype(str)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:43:38