如何使用 ggplot 更改轴上数字的格式?
Posted
技术标签:
【中文标题】如何使用 ggplot 更改轴上数字的格式?【英文标题】:How do I change the formatting of numbers on an axis with ggplot? 【发布时间】:2012-07-21 13:28:51 【问题描述】:我正在使用 R 和 ggplot 绘制一些数据的散点图,一切都很好,除了 y 轴上的数字采用计算机样式的指数格式,即 4e+05、5e+05 等。这对我来说是不可接受的,所以我想让它显示为 500,000、400,000 等等。获得适当的指数符号也是可以接受的。
情节代码如下:
p <- ggplot(valids, aes(x=Test, y=Values)) +
geom_point(position="jitter") +
facet_grid(. ~ Facet) +
scale_y_continuous(name="Fluorescent intensity/arbitrary units") +
scale_x_discrete(name="Test repeat") +
stat_summary(fun.ymin=median, fun.ymax=median, fun.y=median, geom="crossbar")
非常感谢任何帮助。
【问题讨论】:
小心将ggplot
默认选项描述为“明显不可接受”。你的意思是你有一个不同格式的个人偏好。 4e+05
格式的数字是科学记数法,是各种应用程序的首选格式。
4e+05 不是科学计数法,它是计算机对科学计数法的近似。我能想到的任何印刷期刊都不会接受它,所以我认为它不适合我的论文。
【参考方案1】:
另一个选择是用逗号格式化你的轴刻度标签是使用包scales
,然后添加
scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = comma)
到您的 ggplot 语句。
如果您不想加载包,请使用:
scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = scales::comma)
【讨论】:
令人惊讶的是,这样一个微不足道的问题需要加载一个新包。 仅供参考,这也适用于 scale_y_log10(labels = scales::comma),我假设 ggplot2 中有其他比例。很棒的提示! 这很晚,但你可以将任何函数传递给标签参数,所以scale_x_continuous(labels = function(x) format(x, big.mark = ","))
【参考方案2】:
我还发现了另一种在轴上给出正确的“x10(上标)5”符号的方法。我在这里发布它,希望它可能对某些人有用。我从here 获得了代码,所以我认为它没有任何功劳,这正确地归于 Brian Diggs。
fancy_scientific <- function(l)
# turn in to character string in scientific notation
l <- format(l, scientific = TRUE)
# quote the part before the exponent to keep all the digits
l <- gsub("^(.*)e", "'\\1'e", l)
# turn the 'e+' into plotmath format
l <- gsub("e", "%*%10^", l)
# return this as an expression
parse(text=l)
然后你可以用作
ggplot(data=df, aes(x=x, y=y)) +
geom_point() +
scale_y_continuous(labels=fancy_scientific)
【讨论】:
如果您不想将 0 打印为“0 x 10⁺⁰”,请在format(...)
行下方添加以下内容:l <- gsub("0e\\+00","0",l)
如果您想对其他情况进行特殊处理,最简单的方法是在format()
之后直接添加更多gsub()
,同时在单独的控制台中测试format()
针对您的情况返回的内容。
在最后一个 gsub
命令之前添加这个:# remove + after exponent, if exists. E.g.: (3x10^+2 -> 3x10^2)
l <- gsub("e\\+","e",l)
并在它之后:# convert 1x10^ or 1.000x10^ -> 10^
l <- gsub("\\'1[\\.0]*\\'\\%\\*\\%", "", l)
使其成为论文中常用的格式。
在此处询问此答案的后续问题:***.com/questions/63477686/…【参考方案3】:
x <- rnorm(10) * 100000
y <- seq(0, 1, length = 10)
p <- qplot(x, y)
library(scales)
p + scale_x_continuous(labels = comma)
【讨论】:
当我尝试这个时,我得到一个错误,即格式化程序是一个未使用的参数?它需要另一个包还是什么? 我将代码更改为包含library(scales)
并使用comma
,这应该比我之前的功能更好。【参考方案4】:
我来晚了,但如果其他人想要一个简单的解决方案,我创建了一组函数,可以这样调用:
ggplot + scale_x_continuous(labels = human_gbp)
它为您提供 x 或 y 轴的人类可读数字(或任何一般的数字)。
你可以在这里找到函数:Github Repo 只需将函数复制到脚本中即可调用它们。
【讨论】:
【参考方案5】:我发现 Jack Aidley 的建议答案很有用。
我想放弃另一个选择。假设您有一个包含许多小数字的系列,并且您希望确保轴标签写出完整的小数点(例如 5e-05 -> 0.0005),那么:
NotFancy <- function(l)
l <- format(l, scientific = FALSE)
parse(text=l)
ggplot(data = data.frame(x = 1:100,
y = seq(from=0.00005,to = 0.0000000000001,length.out=100) + runif(n=100,-0.0000005,0.0000005)),
aes(x=x, y=y)) +
geom_point() +
scale_y_continuous(labels=NotFancy)
【讨论】:
这可以通过使用匿名函数来缩短:scale_y_continuous(labels=function(n)format(n, scientific = FALSE))
为什么没有这样的预定义格式化程序,地狱知道。
@eMPee584 很抱歉打扰了这个旧回复,但请考虑将其作为答案,以便更容易找到:) 您的评论比某些实际答案获得更多支持。以上是关于如何使用 ggplot 更改轴上数字的格式?的主要内容,如果未能解决你的问题,请参考以下文章