Plotly Express:如何在数据标签上为千位添加逗号分隔符

Plotly Express: How to add comma separators for thousands on data labels

我正在使用 Plotly Express 中的 px.bar() 函数创建一些简单的条形图。

我的代码如下:

import plotly.express as px
import pandas as pd

test_df = pd.DataFrame({'Manufacturer':['Ford', 'Ford', 'Mercedes', 'BMW', 'Ford', 'Mercedes', 'BMW', 'Ford', 'Mercedes', 'BMW', 'Ford', 'Mercedes', 'BMW', 'Ford', 'Mercedes', 'BMW', 'Ford', 'Mercedes', 'BMW'],
                          'Metric':['Orders', 'Orders', 'Orders', 'Orders', 'Orders', 'Orders', 'Orders', 'Sales', 'Sales', 'Sales', 'Sales', 'Sales', 'Sales', 'Warranty', 'Warranty', 'Warranty', 'Warranty', 'Warranty', 'Warranty'],
                          'Sector':['Germany', 'Germany', 'Germany', 'Germany', 'USA', 'USA', 'USA', 'Germany', 'Germany', 'Germany', 'USA', 'USA', 'USA', 'Germany', 'Germany', 'Germany', 'USA', 'USA', 'USA'],
                          'Value':[45000, 70000, 90000, 65000, 40000, 65000, 63000, 2700, 4400, 3400, 3000, 4700, 5700, 1500, 2000, 2500, 1300, 2000, 2450],
                          'City': ['Frankfurt', 'Bremen', 'Berlin', 'Hamburg', 'New York', 'Chicago', 'Los Angeles', 'Dresden', 'Munich', 'Cologne', 'Miami', 'Atlanta', 'Phoenix', 'Nuremberg', 'Dusseldorf', 'Leipzig', 'Houston', 'San Diego', 'San Francisco']
                       })

df1 = pd.DataFrame(test_df.groupby(by=['Manufacturer', 'Sector'])['Value'].sum())

df1.reset_index(inplace=True)

fig = px.bar(df1, x='Manufacturer', y='Value', color='Sector', barmode='group', text='Value')

fig.show()

是否可以为条形图上的千位值添加逗号分隔符?例如,“70,900”而不是“70900”?

我查看了 https://plotly.com/python-api-reference/generated/plotly.express.bar.html#plotly.express.bar 的文档,但没有看到任何可以控制我正在寻找的行为的内容。

提前致谢!

您需要在绘图前将逗号附加到数据框。所以,你可以这样做:

...
...
df1["Value"] = df1["Value"].apply(lambda x : "{:,}".format(x))
fig = px.bar(df1, x='Manufacturer', y='Value', color='Sector', barmode='group', text='Value')
fig.show()

结果如下图:

有一个具有updata_traces功能的格式化程序,texttemplate keyword, following the D-3 format

语法为:

fig.update_traces(texttemplate='%{text:,}')