2011-08-05 221 views
10

我有一个正态分布图和一个直方图绘图,x轴以对数刻度显示0,10^0,10^1 ...我希望在主要的。实际上,我可以使用在我的previous question中给出的解决方案,将主要刻度格式从1,2,3等更改为10^0,10^1,10^2,10^3。我使用以下代码作为主要的对话框:在R轴x轴显示次要对数刻度

major.ticks <- axTicks(1) 
labels <- sapply(major.ticks,function(i) 
      as.expression(bquote(10^ .(i))) 
     ) 
axis(1,at=major.ticks,labels=labels) 

可以编辑它来标记小标记而不标记它们吗?

+0

或者其他新的方式是最欢迎!谢谢。 – user744121

+0

我编辑了您的问题以包含上一个问题的链接。这使代码和问题更容易理解。 –

回答

11

Hmisc中有一个函数minor.tick,但是那个与对数尺度差不多。我使用以下函数来获得遵循对数标度的次要刻度。 ax是使用它上(相同的功能axis)的轴线,n是次要蜱(默认为9)的数量,t.ratio是主要和次要蜱之间的比率,并与...可以将额外的参数到axis

编辑:好评在评论中,所以我编辑了我的功能。有两个额外的参数,mnmx的最小和对数刻度最大mn=0从而表示最小为10^0或1!)

功能:

minor.ticks.axis <- function(ax,n,t.ratio=0.5,mn,mx,...){ 

    lims <- par("usr") 
    if(ax %in%c(1,3)) lims <- lims[1:2] else lims[3:4] 

    major.ticks <- pretty(lims,n=5) 
    if(missing(mn)) mn <- min(major.ticks) 
    if(missing(mx)) mx <- max(major.ticks) 

    major.ticks <- major.ticks[major.ticks >= mn & major.ticks <= mx] 

    labels <- sapply(major.ticks,function(i) 
      as.expression(bquote(10^ .(i))) 
     ) 
    axis(ax,at=major.ticks,labels=labels,...) 

    n <- n+2 
    minors <- log10(pretty(10^major.ticks[1:2],n))-major.ticks[1] 
    minors <- minors[-c(1,n)] 

    minor.ticks = c(outer(minors,major.ticks,`+`)) 
    minor.ticks <- minor.ticks[minor.ticks > mn & minor.ticks < mx] 


    axis(ax,at=minor.ticks,tcl=par("tcl")*t.ratio,labels=FALSE) 
} 

这可以如下应用:

x <- 10^(0:8) 
y <- 1:9 
plot(log10(x),y,xaxt="n",xlab="x",xlim=c(0,9)) 
minor.ticks.axis(1,9,mn=0,mx=8) 

给出:

enter image description here

+0

谢谢。这似乎对我来说很好,但我不得不在minor.ticks.axis(2m)中删除多余的'm'。另外,为什么这是必要的。现在我有了小勾号,既然我的比例从10^0开始,那么在此之前我不会再要额外的小勾号。如何控制? – user744121

+0

@ user744121我编辑了我的功能,好主意!额外的'm'是一个错字,我之前编辑过。其余的,请看额外的解释。 –

+0

似乎很好你的功能,但我有一个10^-4哟10^1之间的范围。我们如何改变功能以便让位置低于mn = 0? – JPV

0

使用""作为小勾号的标签。

+0

如果您对线性刻度上与您的主要刻度线尺寸相同的刻度线很满意,那么这将起作用。否则,事情有点复杂... –

2

下面是一个简单的函数来以这样的:

log10.axis <- function(side, at, ...) { 
    at.minor <- log10(outer(1:9, 10^(min(at):max(at)))) 
    lab <- sapply(at, function(i) as.expression(bquote(10^ .(i)))) 
    axis(side=side, at=at.minor, labels=NA, tcl=par("tcl")*0.5, ...) 
    axis(side=side, at=at, labels=lab, ...) 
} 

下面是一个例子:

x <- exp(rnorm(200, 5)) 
hist(log(x), 20, xaxt="n", xlim=c(0, 8)) 
log10.axis(1, at=seq(0, 8, 2)) 

给出: enter image description here

+0

'tcl = par(“tcl”)* 0.5'是一个很棒的技巧。在我看来,这比修改'minor.tick'函数更简单 –

0

有一个小误差,

lims<-lims[3:4]失踪

minor.ticks.axis <- function(ax,n,t.ratio=0.5,mn,mx,...){ 

    lims <- par("usr") 
    if(ax %in%c(1,3)) lims <- lims[1:2] else lims <- lims[3:4] 

    major.ticks <- pretty(lims,n=5) 
    if(missing(mn)) mn <- min(major.ticks) 
    if(missing(mx)) mx <- max(major.ticks) 

    major.ticks <- major.ticks[major.ticks >= mn & major.ticks <= mx] 

    labels <- sapply(major.ticks,function(i) 
      as.expression(bquote(10^ .(i))) 
     ) 
    axis(ax,at=major.ticks,labels=labels,...) 

    n <- n+2 
    minors <- log10(pretty(10^major.ticks[1:2],n))-major.ticks[1] 
    minors <- minors[-c(1,n)] 

    minor.ticks = c(outer(minors,major.ticks,`+`)) 
    minor.ticks <- minor.ticks[minor.ticks > mn & minor.ticks < mx] 


    axis(ax,at=minor.ticks,tcl=par("tcl")*t.ratio,labels=FALSE) 
} 
0

ggplot2,我们可以一起scales::trans_breaksscales::trans_format使用annotation_logticks。以下是从上面的链接中取得的一个例子。

library(ggplot2) 

    a <- ggplot(msleep, aes(bodywt, brainwt)) + 
     geom_point(na.rm = TRUE) + 
     scale_x_log10(
     breaks = scales::trans_breaks("log10", function(x) 10^x), 
     labels = scales::trans_format("log10", scales::math_format(10^.x)) 
    ) + 
     scale_y_log10(
     breaks = scales::trans_breaks("log10", function(x) 10^x), 
     labels = scales::trans_format("log10", scales::math_format(10^.x)) 
    ) + 
     theme_bw() 

    a + annotation_logticks() # Default: log ticks on bottom and left 

enter image description here