ggplot2 y轴的对数刻度导致曲线

时间:2015-12-13 22:04:49

标签: r logging ggplot2 scale

我想将一些数据作为群体的一种手段随时间变化,每条群体的线路连接不同的平均时间点。

这个代码是:

line<-ggplot(dat, aes(Time, Cortisol.ngmL, shape=T))

line+
stat_summary(fun.y=mean, geom="point", size=4, aes(group=T))+
stat_summary(fun.y=mean, geom="line", aes(group=T), linetype="dashed", lwd=0.7)

但是......我想记录y轴(log10)。当我这样做时,连接组的时间线变得弯曲(下面的代码)

line<-ggplot(dat, aes(Time, Cortisol.ngmL, shape=T))

line+
stat_summary(fun.y=mean, geom="point", size=4, aes(group=T))+
stat_summary(fun.y=mean, geom="line", aes(group=T), linetype="dashed", lwd=0.7)+
coord_trans(y="log10")

有没有人知道我可以使用对数刻度和直线的方法?

1 个答案:

答案 0 :(得分:1)

我使用此功能以对数刻度连接点与直线:

log_line <- function(x, y, n = 1000) {
  l <- lapply(2:length(x),
              function(i, n) {
                xl <- seq(x[i - 1], x[i], (x[i] - x[i - 1]) / n)
                yl <- exp(log(y[i]) + (xl - x[i]) * (log(y[i]) - log(y[i - 1])) / (x[i] - x[i - 1]))
                return(data.frame(x = xl, y = yl))
              },
              n)

  return(do.call(rbind, l))
}

参数是您想要用对数刻度中的直线连接的点的x和y坐标,以及要在每对原始点之间预测的n个点。

此函数在每个点之间以对数刻度拟合直线,预测两个原始点之间的新点,然后将它们转换回原始刻度。输出是具有预测值x和y坐标的数据帧。

可以轻松添加到ggplot中:

v1 <- 1:10
v2 <- exp(-v1)

ggplot() +
  geom_point(aes(v1, v2)) +
  geom_line(aes(x, y), data = log_line(v1, v2)) +
  coord_trans(y = "log")