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

Plotly Dash数字缩写格式修改求助:替换G/T为百万/十亿表述

解决Dash/Plotly中数字缩写显示为G/T(而非M/B)的问题

问题背景

在基于Dash开发的交易类Web应用中,使用Plotly的d3格式处理数字时,百万(1,000,000)会被显示为1G、十亿(1,000,000,000)显示为1T——这是因为d3的s(短格式)默认沿用字节单位的缩写规则,而非金融场景常用的M(百万)、B(十亿)表述。

解决方案

1. Dash DataTable 自定义数字格式

Dash DataTable支持通过formatter参数自定义数值显示逻辑,替代内置的d3格式。我们可以实现专属函数,将大数字转换为金融场景的缩写形式:

from dash import Dash, dash_table
import pandas as pd

# 自定义金融数字格式化函数
def format_financial_number(value, suffix=""):
    if pd.isna(value):
        return ""
    # 处理百万(M)
    if abs(value) >= 1_000_000 and abs(value) < 1_000_000_000:
        return f"{value/1_000_000:.2f}M{suffix}"
    # 处理十亿(B)
    elif abs(value) >= 1_000_000_000:
        return f"{value/1_000_000_000:.2f}B{suffix}"
    # 小额数字保留原精度
    else:
        return f"{value:.2f}{suffix}"

# 示例数据
df = pd.DataFrame({
    "nb_operation": [1234567, 987654321, 45678],
    "amount_euro": [1234567.89, 987654321.12, 45678.90]
})

app = Dash(__name__)

app.layout = dash_table.DataTable(
    data=df.to_dict('records'),
    columns=[
        {
            "name": ["Transactions", "Total number"],
            "id": "nb_operation",
            "type": "numeric",
            "formatter": lambda x: format_financial_number(x)
        },
        {
            "name": ["Transactions", "Total amount"],
            "id": "amount_euro",
            "type": "numeric",
            "formatter": lambda x: format_financial_number(x, " €")
        },
    ],
    merge_duplicate_headers=True
)

if __name__ == '__main__':
    app.run_server(debug=True)

2. Plotly图表 自定义刻度/数值格式

对于Plotly图表(如条形图、折线图),可以通过修改轴刻度或数据标签的格式来实现需求:

方法1:自定义轴刻度文本

import plotly.express as px

fig = px.bar(df, x="nb_operation", y="amount_euro")

# 定义刻度转换函数
def generate_tick_text(tick_val):
    if tick_val >= 1_000_000_000:
        return f"{tick_val/1_000_000_000:.1f}B €"
    elif tick_val >= 1_000_000:
        return f"{tick_val/1_000_000:.1f}M €"
    else:
        return f"{tick_val:.0f} €"

# 替换原始刻度文本
original_ticks = fig.layout.yaxis.tickvals
fig.layout.yaxis.ticktext = [generate_tick_text(val) for val in original_ticks]

fig.show()

方法2:自定义图表数据标签

fig = px.bar(df, x="nb_operation", y="amount_euro", text="amount_euro")

# 替换数据标签为金融格式
fig.update_traces(
    text=[format_financial_number(num, " €") for num in df["amount_euro"]],
    textposition='outside'
)

fig.show()

额外说明

如果需要多语言适配或更复杂的格式规则,也可以修改d3的locale配置,但自定义函数的方式更直接,无需依赖外部配置,更贴合交易场景的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:45:40