首页 > 解决方案 > 如何从标签切割间隔中删除 E 符号并用速记标签替换?

问题描述

希望通过任何一个label_number_si()或类似的东西来用 SI 单位标记切割间隔(“k”代表千等)。

library(scales)
library(tidyverse)

dat <- data.frame(test_x=1:1e5, test_y=1) %>% 
  mutate(label_cut=cut_width(test_x,1e4, boundary = 0))

ggplot(dat) +
  geom_col(aes(test_x,label_cut)) +
  scale_x_continuous(labels = label_number_si())

在此处输入图像描述

标签: rggplot2

解决方案


不得不编写一些自定义函数来打破间隔:

library(scales)
library(tidyverse)

SI_format <- function(x) {
  case_when(
    x < 1e3 ~ as.character(x),
    x < 1e6 ~ paste0(as.character(x/1e3), "K"),
    x < 1e9 ~ paste0(as.character(x/1e6), "M"),
    x < 1e12 ~ paste0(as.character(x/1e9), "B"),
    x < 1e15 ~ paste0(as.character(x/1e12), "T"),
    TRUE ~ "..."
  )
}

pretty_labels <- function(x) {

first_bracket <- str_extract(x,"^.") 
last_bracket <- str_extract(x,".$")
first_number <- SI_format(as.numeric(str_extract(x,"(\\d+)")))
last_number <- SI_format(as.numeric(str_extract(x,"(\\d+)(?!.*\\d)")))

new_label <- paste0(first_bracket,first_number,",",last_number,last_bracket)
return(new_label)
}

dat <- data.frame(test_x=c(0,1, 10, 1e2,1e3,1e4,1e5,1e6), test_y=1) %>% 
  mutate(label_cut=cut_width(test_x,1e3, boundary = 0, dig.lab=10))

levels(dat$label_cut) <- pretty_labels(levels(dat$label_cut))

ggplot(dat) +
  geom_col(aes(test_x,label_cut)) +
  scale_x_continuous(labels = label_number_si())

在此处输入图像描述


推荐阅读