在没有明确指定中断的情

时间:2013-08-28 05:02:45

标签: r ggplot2

我发现ggplot2在使用scale_y_log10时有时会产生太少的刻度线。我试图从任意数据自动生成绘图,我正在寻找一种方法来增加刻度线的数量而不明确指定它们(因为我事先不知道数据是什么)。例如,这是一个创建一个带有log-y-scale的简单散点图的函数:

example_plot <- function(x) {
  p <- ggplot(d, aes(x=MW, y=rel.Ki)) + 
    geom_point() +
    scale_y_log10()
  p
}

这通常会运作良好,但需要以下数据

d <- structure(list(MW = c(89.09, 174.2, 147.13, 75.07, 131.17, 131.17, 146.19, 149.21, 165.19, 115.13, 181.19, 117.15), rel.Ki = c(2.91438577473767, 1, 1.07761254731238, 1.0475715900998, 0.960123906592881, 0.480428471483881,  1.50210548081627, 0.318457530434953, 0.458477212731015, 1.92246139937586,  0.604121577795352, 2.4111345825694)), .Names = c("MW", "rel.Ki"), class = "data.frame", row.names = c(1L, 6L, 11L, 16L, 21L, 26L, 31L, 36L, 41L, 47L, 54L, 59L))

它产生

print(example_plot(d))

enter image description here

y轴上的单个刻度标记不是很有帮助。有没有办法可以防止这种情况,而不是重写自动蜱位置拣选功能?

2 个答案:

答案 0 :(得分:8)

我刚刚通过阅读?continuous_scale发现的有趣发现是breaks参数可以是:

  

一个函数,当使用单个参数调用时,给出比例限制的字符向量返回一个字符向量,指定要显示的中断。

因此,为了保证一定数量的休息时间,您可以执行以下操作:

break_setter = function(lims) {
  return(seq(from=as.numeric(lims[1]), to=as.numeric(lims[2]), length.out=5))
}

ggplot(d, aes(x=MW, y=rel.Ki)) + 
    geom_point() +
    scale_y_log10(breaks=break_setter)

显然,非常简单的示例函数并不能很好地适应数据的对数性质,但它确实显示了如何以编程方式更好地处理这个问题。


您还可以使用pretty,其中包含多个休息时间的建议并返回精确的整数。使用

break_setter = function(lims) {
    return(pretty(x = as.numeric(lims), n = 5))
}

产生以下结果:

logbreaks

更好的是,我们可以让break_setter()使用您想要的任何n和默认值(例如5)返回适当的函数。

break_setter = function(n = 5) {
   function(lims) {pretty(x = as.numeric(lims), n = n)}
}

ggplot(d, aes(x=MW, y=rel.Ki)) + 
    geom_point() +
    scale_y_log10(breaks=break_setter())  ## 5 breaks as above

ggplot(d, aes(x=MW, y=rel.Ki)) + 
    geom_point() +
    scale_y_log10(breaks=break_setter(20))

答案 1 :(得分:2)

您可以通过编程方式设置限制。例如,使用您提供的数据,我们可以在函数中定义限制,如下所示:

example_plot <- function(x){
  # identify the range of data
  lims <- c(10^floor(log10(min(x$rel.Ki, na.rm=TRUE))), 
    10^ceiling(log10(max(x$rel.Ki, na.rm=TRUE))))
  # require ggplot2
  require('ggplot2')
  # create the plot
  p <- ggplot(data = x, aes(x = MW, y = rel.Ki)) + 
    geom_point() +
    scale_y_log10(limits = lims)
  p
}

print(example_plot(d))

然后你会在最近的十年得到一个带刻度的图:

How to set limits programmatically

然后,如果要添加对数网格,请使用breaks选项scale_y_log10()作为Marius等人。建议:

 example_plot <- function(x){
  # identify the range of data      
  lims <- c(10^floor(log10(min(x$rel.Ki, na.rm=TRUE))), 
            10^ceiling(log10(max(x$rel.Ki, na.rm=TRUE))))  
   # require ggplot2
  require('ggplot2')
  # create the plot
  p <- ggplot(data = x, aes(x = MW, y = rel.Ki)) + 
    geom_point() +
    scale_y_log10(breaks = pretty(x = lims, n = 5),
                  limits = lims) 
  p 
}

print(example_plot(d))

我个人更喜欢对数图,以显示至少一个数量级的变化,因此这种方法有助于确保发生这种情况。

enter image description here