2011-08-05 160 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