ggplot2中y比例标签的好K/M/G缩写
Posted
技术标签:
【中文标题】ggplot2中y比例标签的好K/M/G缩写【英文标题】:Good K/M/G abbreviation of y scale labels in ggplot2 【发布时间】:2019-12-04 09:22:40 【问题描述】:问题
我们如何轻松拥有没有“位”或“字节”单位符号的 Kilo/Mega/Giga 标签?
示例
data.frame(x = LETTERS[1:5], n = c(0, 5000, 10000, 15000, 20000)) %>%
ggplot(aes(x, n)) +
geom_point() +
scale_y_continuous(labels = scales::number_bytes_format(units = "si"))
对于 y 比例,我希望标签为 0K
、5K
、10K
、15K
、20K
。没有Kb
!
奖金问题
是否有任何可用的解决方案来获得0
、1K
、1M
、1G
标签?即,最合适的值缩写?
【问题讨论】:
替代,除以 1000,并将 y 标记为“n (Kb)”? 我不知道规模的大小。 Il 可能是 K,可能是 M 甚至 G。到现在为止,我只想摆脱"Kb"
中的 "b"
相关帖子:***.com/q/29787452/680068
来自相关帖子:gdata::humanReadable(n, standard = "Unix", sep = "")
【参考方案1】:
试试gdata::humanReadable
:
library(ggplot2)
library(gdata)
myDat <- data.frame(x = LETTERS[1:5], n = c(0, 5000, 10000, 15000, 20000))
ggplot(myDat, aes(x, n)) +
geom_point() +
scale_y_continuous(breaks = myDat$n,
labels = humanReadable(myDat$n, standard = "Unix", sep = ""))
编辑:
我们可以自定义函数:
humanReadableCustom <- function (x, units = "auto", standard = c("IEC", "SI", "Unix"),
digits = 1, width = NULL, sep = " ", justify = c("right",
"left"))
#suffix.SI <- c("B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
# custom
suffix.SI <- c("", "K", "M", "G", "T", "P", "E", "Z", "Y")
suffix.IEC <- c("B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB")
suffix.Unix <- c("B", "K", "M", "G", "T", "P", "E", "Z", "Y")
standard <- match.arg(standard)
if (length(justify) == 1)
justify <- c(justify, justify)
.applyHuman <- function(x, base, suffix, digits, width,
sep)
n <- length(suffix)
i <- pmax(pmin(floor(log(x, base)), n - 1), 0)
if (!is.finite(i))
i <- 0
x <- x/base^i
if (is.null(width))
x <- format(round(x = x, digits = digits), nsmall = digits)
else
lenX <- nchar(x)
if (lenX > width)
digits <- pmax(width - nchar(round(x)) - 1,
0)
if (i == 0)
digits <- 0
x <- round(x, digits = digits)
c(x, suffix[i + 1])
if (any(x < 0))
stop("'x' must be positive")
if (standard == "SI")
suffix <- suffix.SI
base <- 10^3
else if (standard == "IEC")
suffix <- suffix.IEC
base <- 2^10
else
suffix <- suffix.Unix
base <- 2^10
if (!missing(units) && units == "bytes")
retval <- rbind(x, "bytes")
else if (!missing(units) && units != "auto")
units <- suffix[match(toupper(units), toupper(suffix))]
power <- match(units, suffix) - 1
X <- x/(base^power)
X <- format.default(x = X, digits = digits, nsmall = digits)
retval <- rbind(X, rep(units, length(X)))
else retval <- sapply(X = x, FUN = ".applyHuman", base = base,
suffix = suffix, digits = digits, width = width, sep = sep)
if (all(justify == "none"))
paste(trim(retval[1, ]), trim(retval[2, ]), sep = sep)
else paste(format(trim(retval[1, ]), justify = justify[1]),
format(trim(retval[2, ]), justify = justify[2]), sep = sep)
然后绘制
library(ggplot2)
library(gdata)
myDat <- data.frame(x = LETTERS[1:5], n = c(0, 5000, 10000, 15000, 20000))
ggplot(myDat, aes(x, n)) +
geom_point() +
scale_y_continuous(breaks = myDat$n,
labels = humanReadableCustom(myDat$n,
standard = "SI", sep = ""))
【讨论】:
谢谢,但这不是我想要的 •standard : character, "IEC" for powers of 1024 ('MiB'), "SI" for powers of 1000 ('MB'), or "Unix" for powers of 1024 ('M'). See details.
• 我想要 1000('M')的幂,并且可能使用 g(克)、m(米)作为单位而不是 b (位)
@Costin 查看编辑,我们可以窃取代码并根据需要进行更新。
如果我们偷窃,我更喜欢从这里:***.com/a/1094933/2107667 :) 谢谢@zx8754
@Costin 没问题,这只是一个想法,你可以随意定制。以上是关于ggplot2中y比例标签的好K/M/G缩写的主要内容,如果未能解决你的问题,请参考以下文章
强制 R 停止绘制缩写轴标签 - 例如ggplot2 中的 1e+00
查找比例 x 或 y 连续的限制或避免删除 ggplot2 和 ggmap 中的行
R语言ggplot2可视化:使用dplyr包计算每个分组个数的比例使用ggplot2可视化条形图(bar plot)并在条形图上添加百分比标签
R语言ggplot2可视化:使用dplyr包计算每个分组个数的比例(对计算获得的百分比进行近似,值保留整数部分)使用ggplot2可视化条形图(bar plot)并在条形图上添加百分比标签
R语言ggplot2可视化:ggplot2中使用element_text函数设置轴标签文本粗体字体(bold text,只设置y轴的标签文本使用粗体字体)