【问题标题】:ggplot2 and scales package: the parameter negative_parens = TRUE does not workggplot2 和 scales 包:参​​数negative_parens = TRUE 不起作用
【发布时间】:2020-05-03 05:07:21
【问题描述】:

我试图使用 scales 包为复杂的表格生成格式。以下助手应用了 scales 包中的 label_percent 和 label_number_si 函数。

由于某种原因,negative_parens = TRUE 没有产生正确的输出:

prettify_numbers_as_percent <- function(x){   
lapply(as.list(as.numeric(x)),label_percent(accuracy = 1,  suffix = "%", negative_parens = TRUE, sep = " ")) %>%

    unlist() %>%
    return() }



prettify_numbers_as_si <- function(x){
  lapply(as.list(as.numeric(x)), label_number_si(accuracy = 1,  negative_parens = TRUE, sep = " ")) %>%
    unlist() %>%
    return()
}

当我跑步时

prettify_numbers_as_si(50000) 
prettify_numbers_as_percent(0.05)

我得到了预期的输出:

“50K”
“5%”

当我跑步时

prettify_numbers_as_si(-50000) 
prettify_numbers_as_percent(-0.05)

尽管设置了negative_parens = TRUE,但我得到了不正确的输出:

“-50K”
“-5%”

有谁知道参数设置失败的原因吗?

【问题讨论】:

    标签: r plot number-formatting


    【解决方案1】:

    问题在于,虽然scales 包中的其他函数将negative_parens= 作为参数,但label_percentlabel_number_si 没有。因此,您必须将该逻辑写入您的函数:

    new_percent <- function(x){
      perc <- lapply(
        as.list(as.numeric(x)),
        label_percent(
          accuracy=1, suffix = '%', sep=' '
        )
      ) %>%
      unlist()
    
      for(i in 1:length(perc)){
        if(substring(perc[i],1,1)=='-'){
          perc[i] <- paste0('(',substring(perc[i],2),')')
        }
      }
      return(perc)
    }
    
    new_numbers <- function(x){
      nums <- lapply(
        as.list(as.numeric(x)),
        label_number_si(
          accuracy = 1,  sep = " "
        )
      ) %>%
      unlist()
      for(i in 1:length(nums)){
        if (substring(nums[i],1,1)=='-'){
          nums[i] <- paste0('(',substring(nums[i],2),')')
        }
      }
      return(nums)
    }
    

    由于您知道返回中需要放在括号中的每个值都以"-" 开头,因此我使用for 循环和substring() 遍历每个项目并转换那些以@ 开头的项目987654330@ 以括号开头和结尾。效果很好:

    test_perc <- c(-0.5, -0.05, 1.2, .23, -0.13)
    test_nums <- c(6000,-60000, 74000, -56000000)
    
    > new_percent(test_perc)
    [1] "(50%)" "(5%)"  "120%"  "23%"   "(13%)"
    > new_numbers(test_nums)
    [1] "6K"    "(60K)" "74K"   "(56M)"
    

    【讨论】:

    • 我基本上找到了类似的解决方案。但是,我的印象是negative_parens = TRUE曾经适用于label_percent和label_number_si。如果我发现任何东西,我会尝试调查更改日志并发布更新。
    • As of 6 months ago 似乎这是label_percent 的缺失参数。该示例中的修复只是使用dollar_format 并删除prefix=。你可以在这里用你的百分比来做到这一点,但是你必须加回"%" 和乘以 100。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    相关资源
    最近更新 更多