python中的B(十亿)而不是G(千兆)plotly customdata [SI前缀d3]

2024-02-28

我已经经历过this https://community.plotly.com/t/custom-si-unit-prefixes/29739, this https://stackoverflow.com/questions/40774677/d3-formatting-tick-value-to-show-b-billion-instead-of-g-giga以及其他一些类似的帖子。他们都用 javascript 提供了解决方案,但我无法将其移植到 python 中。如有帮助,将不胜感激。

当我将值传递给customdata它足够大到十亿,它显示符号为 G(代表千兆)而不是 B,而plotly 默认为 B,可以在图像中看到比较。有没有办法用B代替G?

import pandas as pd
import plotly.express as px

df = pd.DataFrame({'x':[500,3000,50000,100000,7000000,80000000,400000000,9000000000]})
more_data = [100,3000,50000,600000,2000000,90000000,500000000,3000000000]

fig = px.line(df, log_y=True)
fig.update_traces(mode='lines+markers',
                  customdata=more_data,
                  hovertemplate='%{y}<br>%{customdata:,.1s}')

这不会是有史以来最优雅的解决方案,但它可以解决您的问题。如果你仔细观察你的图,你在索引 1 上也有问题,其中数据过多3000<br>3k.

所以我实际上是在明确地编写悬停数据。我们需要这个函数human_format from here https://stackoverflow.com/a/45846841/4819376.

Data

import pandas as pd
import plotly.express as px
df = pd.DataFrame({'x': [500,3000,50000,100000,7000000,80000000,400_000_000,9_000_000_000],
                  'more_data': [100,3000,50000,600000,2000000,90000000,500000000,3_000_000_000]})

写入悬停数据

def human_format(num):
    num = float('{:.3g}'.format(num))
    magnitude = 0
    while abs(num) >= 1000:
        magnitude += 1
        num /= 1000.0
    return '{}{}'.format('{:f}'.format(num).rstrip('0').rstrip('.'), 
                         ['', 'K', 'M', 'B', 'T'][magnitude])

df["hover_data"] = df.apply(lambda r: 
    f"{human_format(r['x'])}<br>{human_format(r['more_data'])}",
                            axis=1)

Plot

fig = px.line(df, 
              y="x", log_y=True)
fig.update_traces(mode='lines+markers',
                  customdata=df['hover_data'],
                  hovertemplate='%{customdata}')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python中的B(十亿)而不是G(千兆)plotly customdata [SI前缀d3] 的相关文章

随机推荐