如何用scales::label_percent在ggplot中实现绝对百分比刻度?
问题:如何用scales::label_percent实现绝对百分比刻度?
我在ggplot中使用如下代码设置y轴刻度:
library(scales) demo_continuous(c(-0.5, 0, 1))
我希望实现绝对百分比刻度,目前已经掌握这些方法:
- 实现绝对刻度:
demo_continuous(c(-0.5, 0, 1), labels = base::abs) - 实现百分比刻度:
demo_continuous(c(-0.5, 0, 1), labels = scales::label_percent(accuracy = 0.1)) - 用旧版
scales::percent实现绝对百分比刻度:demo_continuous(c(-0.5, 0, 1), labels = function(x) scales::percent(base::abs(x)))
但scales::percent已被scales::label_percent取代,不清楚如何用label_percent复现上述旧代码的效果。
解决方法
你可以先对输入值取绝对值,再传给label_percent生成的格式化函数,具体有两种简洁写法:
写法一:匿名函数直接处理
直接在匿名函数中先取绝对值,再调用label_percent返回的格式化函数:
demo_continuous(c(-0.5, 0, 1), labels = function(x) scales::label_percent(accuracy = 0.1)(base::abs(x)))
写法二:封装成可复用的标签函数
如果需要多次使用,可以把逻辑封装成自定义函数,方便调整精度参数:
# 定义绝对百分比标签函数 abs_percent_label <- function(accuracy = 1) { function(x) scales::label_percent(accuracy = accuracy)(base::abs(x)) } # 使用示例 demo_continuous(c(-0.5, 0, 1), labels = abs_percent_label(accuracy = 0.1))
如果使用purrr包,还可以用函数组合的方式实现:
library(purrr) demo_continuous(c(-0.5, 0, 1), labels = compose(scales::label_percent(accuracy = 0.1), base::abs))
以上写法均能实现和旧代码function(x) scales::percent(base::abs(x))完全一致的效果——将原始数值取绝对值后格式化为百分比刻度。
内容的提问来源于stack exchange,提问作者Roccer
相关产品推荐
相关产品推荐

