在R中标记对数刻度显示

18

如何在R语言中绘制以对数刻度为比例的直方图、散点图等图形时,使用10^-1 10^0 10^1 10^2 10^3等标签,而不是只显示-1、0、1、2、3等轴标签?在hist()、plot()等命令中应添加哪些参数?


1
如果您在ggplot2内进行对数转换,则ggplot2会自动执行此操作。请参见此页面底部的示例:http://had.co.nz/ggplot2/geom_boxplot.html - Ari B. Friedman
谢谢,这对我很有帮助。此外,我在这里还找到了一些非常有用的东西 http://r.789695.n4.nabble.com/log-y-axis-of-histogram-td2399498.html - user744121
3个回答

22

除了 ggplot2 的解决方案(参见 gsk3 的评论)之外,我想补充一下,在 plot() 中正确使用参数时也会自动发生这种情况,例如:

x <- 1:10
y <- exp(1:10)
plot(x,y,log="y")
您可以在 X 轴上使用参数 log="x",或是在两个轴上使用参数 log="xy"

如果您想要格式化数字,或者您的数据已经是对数格式,您可以通过使用 axis() 来进行一些绕开的操作。以下是一些有趣的函数:

  • axTicks(x) 可以生成 X 轴(x=1)或 Y 轴(x=2)刻度线的位置。
  • bquote() 将表达式转换为语言,但可以将变量替换为其值。更多关于 bquote() 的信息,请参见问题R 中图表标签中的 Latex 和变量?
  • as.expression() 使来自 bquote() 的语言对象成为表达式。这允许 axis()?plotmath 所解释的那样进行格式化。它无法处理语言对象。

下面是一个好看的格式化的例子:

x <- y <- 1:10
plot(x,y,yaxt="n")
aty <- axTicks(2)
labels <- sapply(aty,function(i)
            as.expression(bquote(10^ .(i)))
          )
axis(2,at=aty,labels=labels)

这会给出:

在此输入图片描述


谢谢,这非常有用,我认为这是一个通用的解决方案。对我来说完全有效。 - user744121

18

这里有一种不同的方法来绘制这种类型的坐标轴:

plot(NA, xlim=c(0,10), ylim=c(1, 10^4), xlab="x", ylab="y", log="y", yaxt="n")
at.y <- outer(1:9, 10^(0:4))
lab.y <- ifelse(log10(at.y) %% 1 == 0, at.y, NA)
axis(2, at=at.y, labels=lab.y, las=1)

在此输入图片描述

编辑:这也可以在latticeExtra中用scale.components解决。


2
在ggplot2中,您只需添加一个

即可。
... + 
scale_x_log10() + 
scale_y_log10(limits = c(1e-4,1), breaks=c(1e-4,1e-3,1e-2,0.1,1)) + ...

为了缩放您的轴,给它们标签并添加自定义间断点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接