首页 > 解决方案 > 迭代地更改 x 刻度标签

问题描述

我想更改我的 x 刻度标签的格式。它们的生成归功于:

range = pd.cut(df['Notional EUR'],
                   bins=[0, 250000, 500000, 1000000, 5000000, 10000000, 50000000, 100000000, 500000000])
range = range.value_counts(sort=False)
range = range.to_frame()
range.columns = ["Effectif"]
chart = sns.barplot(data=range,
                    color = '#F80116',
                    x=range.index.values,
                    y="Effectif")

我想将其格式化如下:(0, 250K]而不是(0, 250000]. 我尝试了几种方法,例如:xlabels = [f'({l:.2f}, {r:.2f}]'+'K' for l, r in chart.get_xticks()/1000]但没有成功...

以下是相关图表:

在此处输入图像描述

谢谢你的帮助。

标签: pythonpandas

解决方案


如果您希望所有标签都缩写为K(包括 like 5000K),请将所有000([\]\),])模式替换为K\1

xticklabels = [re.sub(r'000([\]\),])', r'K\1', label.get_text()) for label in chart.get_xticklabels()]
chart.set_xticklabels(xticklabels)

xticklabels 为 K

如果您希望标签自适应地缩写(K,M等),您可以使用类似以下human_format()功能的东西:

# adapted from https://stackoverflow.com/a/49955617/13138364
def human_format(match):
    num = int(match.group(0))
    magnitude = 0
    while abs(num) >= 1000:
        magnitude += 1
        num = round(num / 1000.0)
    abbr = ['', 'K', 'M', 'G', 'T', 'P'][magnitude]
    return f'{num:.0f}{abbr}'

xticklabels = [re.sub(r'([0-9]+)', human_format, label.get_text()) for label in chart.get_xticklabels()]
chart.set_xticklabels(xticklabels)

xticklabels 自适应缩写


推荐阅读