如何使用 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 &lt;- gsub("0e\\+00","0",l) 如果您想对其他情况进行特殊处理,最简单的方法是在format() 之后直接添加更多gsub(),同时在单独的控制台中测试format() 针对您的情况返回的内容。 在最后一个 gsub 命令之前添加这个:# remove + after exponent, if exists. E.g.: (3x10^+2 -&gt; 3x10^2) l &lt;- gsub("e\\+","e",l) 并在它之后:# convert 1x10^ or 1.000x10^ -&gt; 10^ l &lt;- 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 更改轴上数字的格式?的主要内容,如果未能解决你的问题,请参考以下文章

在ggplot2中格式化小提琴图

如何使用ggplot2格式化带有轴标签和旋转的R中的雷达图

如何更改x轴上的日期格式[重复]

如何在ggplot2中使用希腊符号?

R:如何在 ggplot 条形图中的右轴上添加标签?

gnuplot:如何在轴上使用 a*(10^b) 格式