如何在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
相关产品推荐
相关产品推荐

