r - 如何从标签切割间隔中删除 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())
解决方案
不得不编写一些自定义函数来打破间隔:
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())
推荐阅读
- python - 模块 'dateutil' 没有属性 'parser' - Dateutil - Python
- ios - SwiftUI 中的状态变量未拾取 UserDefaults .set
- cuda - CUDA - 将纹理从 int 转换为 int4
- hibernate - spring-data:外键作为主键
- merge - 在 PowerBI 中复制子查询
- python - 排列数组的成员,两个成员之间有 k 个差
- django - 在文章下保存评论返回 404 页面未找到
- python - 如何从网页中拉入表格?
- java - Android:如何在字符串到达单行文本框的末尾之前显示字符串并将其余部分显示在不同的文本框中?
- arrays - 为什么 C 允许更改 arr[0] 而不是 ptr[0] 在将它们作为参数传递后?