如何在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
相关产品推荐
相关产品推荐

