对数刻度上绘制与ggplot

问题描述:

数比例较小的休息,以获得ggplot绘制轻微断裂正确,我不得不做这件事情:对数刻度上绘制与ggplot

faceplant1 <- function(x) { 
    return (c(x[1]*10^.25, x[2]/10^.25)) 
} 
faceplant2 <- function(x) { 
    return (rep(seq(1,9),5)*rep(10^seq(-6,-2), each=9)) 
} 
ggplot(mydata, aes(x=myseries)) + 
    geom_density() + 
    scale_x_log10(limits=c(1e-6, 1e-1), 
        breaks=10^seq(-6,-1), 
        minor_breaks=trans_breaks(faceplant1, faceplant2, n=45)) 

有没有一种简单的方法来实现这一目标?

最终的结果应该是这样的:

Plot with log minor breaks

+0

不太清楚,你想要的未成年人休息也对数刻度按大,或者你想数刻度大内的“线性”规模较小的断裂休息? –

+0

后者,我想;如图所示。 – Reinderien

+2

我爱你的函数命名约定; o) – Emmet

这里是我的解决这一问题:

library(ggplot2) 

log10_minor_break = function (...){ 
    function(x) { 
    minx   = floor(min(log10(x), na.rm=T))-1; 
    maxx   = ceiling(max(log10(x), na.rm=T))+1; 
    n_major  = maxx-minx+1; 
    major_breaks = seq(minx, maxx, by=1) 
    minor_breaks = 
     rep(log10(seq(1, 9, by=1)), times = n_major)+ 
     rep(major_breaks, each = 9) 
    return(10^(minor_breaks)) 
    } 
} 

mydata = data.frame(myseries = 10^(rnorm(1e4, mean=0, sd=0.5))) 

myplot = 
    ggplot(mydata, aes(x=myseries))+ 
    geom_density()+ 
    scale_x_log10(minor_breaks=log10_minor_break())+ 
    theme(panel.grid.major.x = element_line(size=1.0), 
     panel.grid.minor.x = element_line(size=2)) 

myplot 

这是非常相似,你已经做了,但已经普遍适用。 还有一点小小的改进:在你的例子中它会扩大在1e-6和above1e-1以下的次要突破。

我已经从看功能trans_break开始,并将其降为最基本的元素。

这也是值得考虑的annotation_logticks()函数:

myplot+annotation_logticks(side="b") 
+0

这似乎并没有标出每个主要的勾号(例如0.01 - 100)。你如何得到每个主要的标记? –

+0

我认为确保所有主要的tick都被标记会涉及scale_x_log10函数中的breaks参数。也许写一个功能,以确保所有重大的休息都包括在内... – gvrocha

+0

如果您有任何建议,请参阅我的改编单独答案。 – Reinderien

年后:我已经适应@ gvrocha的答案是(甚至更多)通用。

log_breaks = function(maj, radix=10) { 
    function(x) { 
    minx   = floor(min(logb(x,radix), na.rm=T)) - 1 
    maxx   = ceiling(max(logb(x,radix), na.rm=T)) + 1 
    n_major  = maxx - minx + 1 
    major_breaks = seq(minx, maxx, by=1) 
    if (maj) { 
     breaks = major_breaks 
    } else { 
     steps = logb(1:(radix-1),radix) 
     breaks = rep(steps, times=n_major) + 
       rep(major_breaks, each=radix-1) 
    } 
    radix^breaks 
    } 
} 
scale_x_log_eng = function(..., radix=10) { 
    scale_x_continuous(..., 
        trans=log_trans(radix), 
        breaks=log_breaks(TRUE, radix), 
        minor_breaks=log_breaks(FALSE, radix)) 
} 
scale_y_log_eng = function(..., radix=10) { 
    scale_y_continuous(..., 
        trans=log_trans(radix), 
        breaks=log_breaks(TRUE, radix), 
        minor_breaks=log_breaks(FALSE, radix)) 
} 

然后使用更优雅:

ggplot(...) + 
    geom_line() + 
    scale_x_log_eng() + 
    scale_y_log_eng()