2015-12-13 18 views
1

我想图表一些数据随时间组的手段,具有连接所述不同的平均时间点每个组线。y轴的GGPLOT2数标度造成弯曲线

的代码是这样的:

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) 

但是......我想记录(LOG10)y轴。当我做连接组跨越时间这行变得弯曲(下面的代码)

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

有谁知道一个方法可以让我有一个日志规模和直线?

+0

我们看不到你的数据,所以不知道它是什么样子,很难给出一个确切的答案。我最好的猜测是图表是正确的。 对数刻度,数据需要遵循指数曲线是直的。也许你的数据不是指数? –

+0

这是一个有趣的问题 - 如何绘制两点之间的直线在对数轴上。 下面是我如何用一个具体的例子做到这一点,但我完全不知道如何对任何两点进行概括。 红线是直上正常规模。蓝线一直盯着对数尺度。 'library(ggplot2); X < - SEQ(从= 1到= 10,由= 0.1); geom_line(aes(x =(9/log10(10))* log10(x)+ 1,y(x) = x),color =“blue”)+ coord_trans(y =“log10”)' 不知道如何推广任何两点 – Mist

回答

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

的参数是要与对数坐标的直线和n连接点的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")