我发现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))
y轴上的单个刻度标记不是很有帮助。有没有办法可以防止这种情况,而不是重写自动蜱位置拣选功能?
答案 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))
}
产生以下结果:
更好的是,我们可以让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))
然后你会在最近的十年得到一个带刻度的图:
然后,如果要添加对数网格,请使用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))
我个人更喜欢对数图,以显示至少一个数量级的变化,因此这种方法有助于确保发生这种情况。