2017-07-18 80 views
0

我在ggplot2中有一个线条图,它由一个分类变量刻面,并且在每个分面图中,这些线被不同的分类变量着色。我根据分面图中的第二个分类变量拟合模型。然后我想让这些图显示每个回归线的斜率+ r^2。在R的ggplot2中的多面模型图中,通过一个因子显示多个模型的斜率?

this question的回答有效,但只适用于带有单一回归线的非小平面情节,而且在我的情况下我一直无法找到如何完成此操作。

我创造了一些示例数据...

ex.ID <- c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,8,8,8,8,8) 
ex.month <- c(0,6,12,18,24,0,6,12,18,24,0,6,12,18,24,0,6,12,18,24,0,6,12,18,24,0,6,12,18,24,0,6,12,18,24,0,6,12,18,24) 
ex.label <- c("A","A","A","A","A","B","B","B","B","B","B","B","B","B","B","A","A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","B","B","A","A","A","A","A") 
ex.score <- c(100,100,89,85,70,95,90,90,86,80,84,80,71,68,60,100,100,98,90,92,100,95,90,85,80,98,96,90,83,81,85,80,78,72,69,95,90,89,85,80) 
ex.status <- c("Y","Y","Y","Y","Y","Z","Z","Z","Z","Z","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","X","X","X","X","X","Z","Z","Z","Z","Z","Y","Y","Y","Y","Y","X","X","X","X","X") 

ex.df <- data.frame(ex.ID,ex.month,ex.label,ex.score,ex.status) 

我再在包GGPLOT2绘制。

ggplot(ex.df)+ 
    geom_line(aes(x=ex.month,y=ex.score,group=ex.ID,color=ex.status)) + 
    facet_grid(.~ex.label) + 
    geom_smooth(aes(x=ex.month,y=ex.score,group=ex.status),method="lm") 

Graphygraph

我希望能够显示在我的图的斜率和R^2这些个别机型的。有多种方法可以在具有多个回归线的小平面上完成此操作?

+1

这个问题的一些解决方案的在被呈现[本类似的问题](HTTPS://计算器的.com /问题/ 19699858/ggplot-加入回归线方程和 - R2-与小面)。 – Tiffany

回答

1

下面是使用by以生成每个组的注释的溶液:

# Generate a data.frane with the annotation for each group 
lm_eqn <- function(df){ 
    m <- lm(ex.score~ex.month , df); 
    eq <- substitute(italic(y) == a + b %.% italic(x)*","~~italic(r)^2~"="~r2, 
        list(a = format(coef(m)[1], digits = 2), 
         b = format(coef(m)[2], digits = 2), 
         r2 = format(summary(m)$r.squared, digits = 3))) 
    data.frame(ex.label=df$ex.label[1],ex.status = df$ex.status[1],label=as.character(as.expression(eq))) 

    } 


# Group by ex.label(used in facet) and ex.ID (aes group on geom_smooth) 
ll <-by(ex.df, list(ex.df$ex.label, ex.df$ex.status),lm_eqn, simplify = F) 

# bind the groups 
ldf <- do.call(rbind,ll) 

# Generate the plot 
ggplot(ex.df)+ 
    geom_line(aes(x=ex.month,y=ex.score,group=ex.ID,color=ex.status)) + 
    facet_grid(.~ex.label) + 
    geom_text(aes(x=15, y = 100+as.numeric(ldf$ex.status), label = label, color=ex.status), data=ldf, parse = TRUE, show.legend = F) + 
    geom_smooth(aes(x=ex.month,y=ex.score,group=ex.status, color=ex.status),method="lm") 

enter image description here

+0

谢谢你的帮助。在第一部分代码中,“df”是指原始数据框,还是在功能内创建新的东西? @Marcelo – David

+1

'df'是函数参数。 'by'会根据组拆分原始data.frame,并为每个新的data.frame调用函数。 – Marcelo

相关问题