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

Jac*_*ley 112 r ggplot2

我正在使用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")
Run Code Online (Sandbox Code Playgroud)

任何帮助非常感谢.

Jim*_* M. 110

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

 scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = comma)
Run Code Online (Sandbox Code Playgroud)

你的ggplot声明.

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

scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = scales::comma)
Run Code Online (Sandbox Code Playgroud)

  • 令人惊讶的是,这样一个微不足道的问题需要加载一个新包. (6认同)
  • 已经很晚了,但是您可以将任何函数传递给 labels 参数,因此 `scale_x_continuous(labels = function(x) format(x, big.mark = ","))` (2认同)

Jac*_*ley 58

我还发现了另一种方法,它在轴上给出了正确的'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)
}
Run Code Online (Sandbox Code Playgroud)

您可以将其用作

ggplot(data=df, aes(x=x, y=y)) +
   geom_point() +
   scale_y_continuous(labels=fancy_scientific) 
Run Code Online (Sandbox Code Playgroud)

  • 如果您不希望0打印为"0x10⁺⁰",请在`format(...)`行下面添加以下内容:`l < - gsub("0e \\ + 00","0 ",升)` (8认同)
  • 在最后一个`gsub`命令之前添加这个:`#dove + exponent之后,如果存在.例如:(3x10 ^ + 2 - > 3x10 ^ 2)``l < - gsub("e \\ +","e",l)`及之后:`#convert1x10 ^或1.000x10 ^ - > 10 ^``l < - gsub("\\'1 [\\.0]*\\'\\%\\*\\%","",l)`以通常用于论文的格式制作. (2认同)

Dis*_*cle 41

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

  • 我改变了代码以包含`library(scales)`并使用`comma`,它应该比我以前的函数更好. (4认同)

Fea*_*yan 15

我在这里比赛迟到了,但是在其他人想要一个简单的解决方案的情况下,我创建了一组可以被称为的函数:

 ggplot + scale_x_continuous(labels = human_gbp)
Run Code Online (Sandbox Code Playgroud)

它为您提供x或y轴的人类可读数字(或一般的任何数字).

您可以在这里找到这些函数:Github Repo 只需将函数复制到您的脚本中即可调用它们.


Eco*_*tis 8

我发现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) 
Run Code Online (Sandbox Code Playgroud)

  • 这可以通过使用匿名函数来缩短:`scale_y_continuous(labels = function(n){format(n,scientific = FALSE)})`为什么没有这样的预定义格式化程序,hell知道. (19认同)
  • @eMPee584 很抱歉撞到了这个旧回复,但请考虑将此作为答案,以便更容易找到它:)您的评论比一些实际答案获得了更多的赞成票。 (3认同)