在 R 的 ggplot2 中通过多面 geom_line 图中的一个因子显示多个模型的斜率?
Displaying the slopes of multiple models by a factor in a faceted geom_line plot in R's ggplot2?
我在 ggplot2 中有一个由分类变量分面的线图,在每个分面图中,线条由不同的分类变量着色。我根据多面图中的第二个分类变量拟合了一个模型。然后我希望图表显示每个回归线的斜率 + r^2。
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")
我希望能够在图表上显示每个模型的斜率和 r^2。有没有什么方法可以在多条回归线的多面图上实现这一点?
这是一个使用 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")
我在 ggplot2 中有一个由分类变量分面的线图,在每个分面图中,线条由不同的分类变量着色。我根据多面图中的第二个分类变量拟合了一个模型。然后我希望图表显示每个回归线的斜率 + r^2。
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")
我希望能够在图表上显示每个模型的斜率和 r^2。有没有什么方法可以在多条回归线的多面图上实现这一点?
这是一个使用 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")