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

如何在plotnine中格式化geom_label()的显示值

解决plotnine中geom_label直接用mizani格式化标签的问题

在plotnine里,mizani.labels.percent()可以直接用来格式化坐标轴标签,但直接把它放到geom_label的label参数里会触发报错——因为geom_label需要的是格式化后的字符串,而不是格式化函数本身。不用提前预处理DataFrame字段的解决方法如下:

错误示例(触发报错)

import pandas as pd
import plotnine as p9
import mizani.labels as ml

df = pd.DataFrame({
    "category": ["A", "B", "C"],
    "rate": [0.12, 0.34, 0.56]
})

# 此处直接调用ml.percent("rate")会报错
(p9.ggplot(df, p9.aes(x="category", y="rate"))
 + p9.geom_col()
 + p9.geom_label(p9.aes(label=ml.percent("rate")))
 + p9.scale_y_continuous(labels=ml.percent())
)

正确写法1:用lambda直接调用格式化函数

直接在label的aes映射里用lambda,把数据列传入ml.percent()生成格式化字符串:

(p9.ggplot(df, p9.aes(x="category", y="rate"))
 + p9.geom_col()
 + p9.geom_label(p9.aes(label=lambda x: ml.percent()(x.rate)))
 + p9.scale_y_continuous(labels=ml.percent())
)

正确写法2:结合after_stat处理统计变换后的值

如果是基于统计变换(比如stat_summary)得到的数值,用after_stat()获取统计结果后再格式化:

(p9.ggplot(df, p9.aes(x="category", y="rate"))
 + p9.geom_col()
 + p9.stat_summary(
     geom="label",
     fun_y="mean",
     aes(label=p9.after_stat(ml.percent()(y)))
 )
 + p9.scale_y_continuous(labels=ml.percent())
)

原理很简单:ml.percent()返回的是一个格式化函数,必须传入具体数值才能生成百分比字符串。通过lambda或after_stat()把数值喂给这个函数,就能在绘图时直接完成格式化,不用提前修改DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 21:33:18