如何修改由 scales 包生成的标签?
How do I modify labels produced by scales package?
所以我正在制作金字塔可视化。我正在使用 scale_y_continuous(labels = scales::label_number_si(accuracy = 0.1))
来生成标签。但是,我想去掉图中女性部分的负号。
我认为保留SI后缀的最好方法,但是去掉负号是修改label_number_si
输出的标签,但是labels = abs(label_number_si())
给出如下错误:Error in abs: non-numeric argument to mathematical function
如有任何见解,我们将不胜感激。
编辑: 使用 demo_continuous(c(-1e10,1e10), label = label_number_si())
标签应该如下所示,除了负数前面不应该有“-”
我敢打赌有一种更简单的方法可以做到这一点,但我还没有想出来。
这是一个使用正常 scales::label_number_si
:
复制问题结果的示例
ggplot(data = data.frame(x = 1000*c(-5:-1, 1:5),
type = rep(1:2, each = 5))) +
geom_col(aes(x,abs(x),fill = type), orientation = "y") +
scale_x_continuous(labels = scales::label_number_si()) +
facet_wrap(~type, scales = "free_x")
我们可以制作 scales::label_number_si
的自定义版本,使它们在最后一步中成为绝对值。为此,我在函数名称上使用命令单击 (Mac OS X) 来查看底层函数的代码,然后将其粘贴到一个新的函数定义中并稍作修改。
label_number_si_abs <- function (accuracy = 1, unit = NULL, sep = NULL, ...)
{
sep <- if (is.null(unit))
""
else " "
function(x) {
breaks <- c(0, 10^c(K = 3, M = 6, B = 9, T = 12))
n_suffix <- cut(abs(x), breaks = c(unname(breaks), Inf),
labels = c(names(breaks)), right = FALSE)
n_suffix[is.na(n_suffix)] <- ""
suffix <- paste0(sep, n_suffix, unit)
scale <- 1/breaks[n_suffix]
scale[which(scale %in% c(Inf, NA))] <- 1
scales::number(abs(x), accuracy = accuracy, scale = unname(scale),
suffix = suffix, ...)
}
}
我们可以替换为自定义函数来获取 abs 值标签:
ggplot(data = data.frame(x = 1000*c(-5:-1, 1:5),
type = rep(1:2, each = 5))) +
geom_col(aes(x,abs(x),fill = type), orientation = "y") +
scale_x_continuous(labels = label_number_si_abs()) +
facet_wrap(~type, scales = "free_x")
所以我正在制作金字塔可视化。我正在使用 scale_y_continuous(labels = scales::label_number_si(accuracy = 0.1))
来生成标签。但是,我想去掉图中女性部分的负号。
我认为保留SI后缀的最好方法,但是去掉负号是修改label_number_si
输出的标签,但是labels = abs(label_number_si())
给出如下错误:Error in abs: non-numeric argument to mathematical function
如有任何见解,我们将不胜感激。
编辑: 使用 demo_continuous(c(-1e10,1e10), label = label_number_si())
标签应该如下所示,除了负数前面不应该有“-”
我敢打赌有一种更简单的方法可以做到这一点,但我还没有想出来。
这是一个使用正常 scales::label_number_si
:
ggplot(data = data.frame(x = 1000*c(-5:-1, 1:5),
type = rep(1:2, each = 5))) +
geom_col(aes(x,abs(x),fill = type), orientation = "y") +
scale_x_continuous(labels = scales::label_number_si()) +
facet_wrap(~type, scales = "free_x")
我们可以制作 scales::label_number_si
的自定义版本,使它们在最后一步中成为绝对值。为此,我在函数名称上使用命令单击 (Mac OS X) 来查看底层函数的代码,然后将其粘贴到一个新的函数定义中并稍作修改。
label_number_si_abs <- function (accuracy = 1, unit = NULL, sep = NULL, ...)
{
sep <- if (is.null(unit))
""
else " "
function(x) {
breaks <- c(0, 10^c(K = 3, M = 6, B = 9, T = 12))
n_suffix <- cut(abs(x), breaks = c(unname(breaks), Inf),
labels = c(names(breaks)), right = FALSE)
n_suffix[is.na(n_suffix)] <- ""
suffix <- paste0(sep, n_suffix, unit)
scale <- 1/breaks[n_suffix]
scale[which(scale %in% c(Inf, NA))] <- 1
scales::number(abs(x), accuracy = accuracy, scale = unname(scale),
suffix = suffix, ...)
}
}
我们可以替换为自定义函数来获取 abs 值标签:
ggplot(data = data.frame(x = 1000*c(-5:-1, 1:5),
type = rep(1:2, each = 5))) +
geom_col(aes(x,abs(x),fill = type), orientation = "y") +
scale_x_continuous(labels = label_number_si_abs()) +
facet_wrap(~type, scales = "free_x")