微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何修改由 scales 包生成的标签?

如何解决如何修改由 scales 包生成的标签?

graphs

所以我正在制作金字塔可视化。我正在使用 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()) 标签应该看起来像下面那样,除了负数前面不应该有“-”

enter image description here

解决方法

我敢打赌有一种更简单的方法可以做到这一点,但我还没有弄清楚。

以下是使用普通 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")

enter image description here

我们可以制作一个自定义版本的 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,orientation = "y") +
  scale_x_continuous(labels = label_number_si_abs()) +
  facet_wrap(~type,scales = "free_x")

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。