R 使用ggplot在对数刻度上绘制小断裂

R 使用ggplot在对数刻度上绘制小断裂,r,ggplot2,R,Ggplot2,为了得到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() +

为了得到
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))

faceplant1以下是我对该问题的解决方案:

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以下和1e-1以上的小断裂

我从查看函数
trans_break
开始,并将其简化为最基本的元素

还值得考虑注释_logticks()函数:

myplot+annotation_logticks(side="b")

几年后:我将@gvrocha的答案改编成(甚至更)通用的

那么使用起来就更优雅了:

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

我想说,最简单的解决方案是使用annotation_logticks()并排列短参数、中参数和长参数来模拟网格线,然后删除网格线并使用适当的比例来绘制数据。比如说,

annotation_logticks(short = unit(1, "npc"), mid = unit(1, "npc"), long = unit(1,"npc"), ...) + 
theme(panel.grid = element_blank()) +
scale_x_log10(breaks = 10^(seq(-6,-1,1)), limits = c(10^-6, 0.1),...)

不清楚,你想让小断裂也按照大断裂在对数尺度上,或者你想让小断裂在对数尺度大断裂内的“线性”尺度上?我认为是后者;如图所示,我喜欢你的函数命名约定;o) 这似乎不是每个主要刻度都有标记(例如0.01-100)。如何标记每个主刻度?我认为确保标记所有主刻度将涉及scale_x_log10函数中的breaks参数。也许写一个函数来确保所有主要的休息都包括在内……如果您有任何建议,请在单独的答案中查看我的改编。
annotation_logticks(short = unit(1, "npc"), mid = unit(1, "npc"), long = unit(1,"npc"), ...) + 
theme(panel.grid = element_blank()) +
scale_x_log10(breaks = 10^(seq(-6,-1,1)), limits = c(10^-6, 0.1),...)