如何使用ggplot更改轴上数字的格式?


131

我正在使用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")

任何帮助,不胜感激。


30
注意将ggplot默认选项描述为“显然不可接受”。您的意思是您个人偏爱其他格式。格式中的数字4e+05是科学计数法,并且将是各种应用程序中的首选格式。
安德里

53
4e + 05不是科学计数法,它是计算机对科学计数法的近似。在我能想到的任何印刷期刊上,这都是不可接受的,因此我认为这对我的论文来说是不可接受的。
杰克·艾德利2012年

Answers:


126

另一种选择是使用包格式化您的坐标轴刻度标签scales,并添加逗号

 scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = comma)

到您的ggplot语句。

如果您不想加载程序包,请使用:

scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = scales::comma)

9
令人惊讶的是,这样一个琐碎的问题需要加载新的程序包。
luchonacho

仅供参考,这也适用于scale_y_log10(labels = scales :: comma),我在ggplot2中假设其他比例。很棒的提示!
TheProletariat

66

我还发现了另一种方法,可以在轴上给出正确的“ x10(上标)5”符号。我将其发布在这里,希望对某些人有用。我从这里获得了代码,因此我对此不负任何责任,这应该归功于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) 

10
如果您不希望将0打印为“ 0 x10⁺⁰”,请在该format(...)行下方添加以下内容:l <- gsub("0e\\+00","0",l)
半外部

1
如果您想对其他情况进行特殊处理,则最简单的做法是gsub()在后面直接添加更多内容format(),同时format()在单独的控制台中测试案例返回的内容。
2015年

3
在最后一个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)使其以论文中通常使用的格式显示。
John_West

44
x <- rnorm(10) * 100000
y <- seq(0, 1, length = 10)
p <- qplot(x, y)
library(scales)
p + scale_x_continuous(labels = comma)

尝试此操作时,我收到错误消息,表明格式化程序是未使用的参数?需要其他包装吗?
杰克·艾德利

4
我将代码更改为包含library(scales)和使用comma,它们应该比我以前拥有的功能更好。
DiscreteCircle

16

我在这里玩游戏迟到了,但是如果其他人想要一个简单的解决方案,我创建了一组函数,可以像这样调用:

 ggplot + scale_x_continuous(labels = human_gbp)

它为您提供了x轴或y轴的人类可读数字(或实际上通常是任何数字)。

您可以在此处找到函数:Github Repo 只需将函数复制到脚本中即可调用它们。


10

我发现杰克·艾德利的建议答案是一个有用的答案。

我想扔掉另一个选择。假设您有一个包含许多小数字的序列,并且要确保轴标签写出完整的小数点(例如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) 

23
可以使用匿名函数来缩短此时间:scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})地狱知道为什么没有这样的预定义格式化程序。
eMPee584 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.