r - 使用 ggplot 在对数刻度上绘制较小的中断

标签 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() +
    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

最佳答案

这是我对该问题的解决方案:

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 开始,并将其简化为最基本的元素。

还值得考虑annotation_logticks()函数:

myplot+annotation_logticks(side="b")

关于r - 使用 ggplot 在对数刻度上绘制较小的中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30179442/

相关文章:

r - 在不规则网格上绘制轮廓

r - 使用 ggplot2 根据 y 值更改线条颜色

r - 在不规则网格上绘制数据的有效方法

r - 是否有 R 函数可以调整条形图轴的比例?

r - 如何使用 FTP 下载 R 包

r - R 中最大子数组和的最快实现

r - 进行主动重置排序或替换数据表中 Shiny 的数据表按钮

r - 当我提供 C.I. 时如何绘制置信区间?值(value)观

r - 为什么在data.table中使用 "character is often preferred to factor"作为 key ?

r - 将带有 facet_grid 的 ggplot2 对象的标题移到中间