6

我发现ggplot2使用scale_y_log10. 我正在尝试从任意数据自动生成绘图,并且我正在寻找一种方法来增加刻度线的数量而不明确指定它们(因为我不提前知道数据将是什么)。例如,这里有一个函数可以创建一个带有 log-y 比例的简单散点图:

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))

在此处输入图像描述

y 轴上的单个刻度线不是很有帮助。除了重写自动刻度位置拾取功能之外,有什么办法可以防止这种情况发生吗?

4

2 回答 2

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))
}

产生以下结果:

日志中断

更好的是,我们可以让break_setter()return 成为一个合适的函数,无论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))
于 2013-08-28T05:54:34.670 回答
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))

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

如何以编程方式设置限制

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

 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))

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

在此处输入图像描述

于 2013-08-28T05:35:41.753 回答