假设我有一个学生在考试中得分的数据。
set.seed(1)
df <- data.frame(question = 0:10,
resp = c(NA,sample(c("Correct","Incorrect"),10,replace=TRUE)),
score.after.resp=50)
for (i in 1:10) {
ifelse(df$resp[i+1] == "Correct",
df$score.after.resp[i+1] <- df$score.after.resp[i] + 5,
df$score.after.resp[i+1] <- df$score.after.resp[i] - 5)
}
df
question resp score.after.resp
1 0 <NA> 50
2 1 Correct 55
3 2 Correct 60
4 3 Incorrect 55
5 4 Incorrect 50
6 5 Correct 55
7 6 Incorrect 50
8 7 Incorrect 45
9 8 Incorrect 40
10 9 Incorrect 35
11 10 Correct 40
我想得到以下图表:
library(ggplot2)
ggplot(df,aes(x = question, y = score.after.resp)) + geom_line() + geom_point()
我的问题是:我想根据学生的反应对这一行的部分进行着色。如果正确(增加)线段为绿色,如果不正确的响应(减少)线应为红色。 我尝试了以下代码,但没有工作:
ggplot(df,aes(x = question, y = score.after.resp, color=factor(resp))) +
geom_line() + geom_point()
有什么想法吗?
答案 0 :(得分:10)
我可能会稍微改变一下,而是使用geom_segment
代替:
df1 <- as.data.frame(with(df,cbind(embed(score.after.resp,2),embed(question,2))))
colnames(df1) <- c('yend','y','xend','x')
df1$col <- ifelse(df1$y - df1$yend >= 0,'Decrease','Increase')
ggplot(df1) +
geom_segment(aes(x = x,y = y,xend = xend,yend = yend,colour = col)) +
geom_point(data = df,aes(x = question,y = score.after.resp))
简要说明:
我正在使用embed
将x和y变量转换为每个线段的起点和终点,然后只需添加一个变量来指示每个段是上升还是下降。然后我使用前面的数据框来自己添加原始点。
或者,我想你可以使用geom_line
这样的东西:
df$resp1 <- c(as.character(df$resp[-1]),NA)
ggplot(df,aes(x = question, y = score.after.resp, color=factor(resp1),group = 1)) +
geom_line() + geom_point(color = "black")
答案 1 :(得分:4)
默认情况下,ggplot2根据映射到因子的美学对数据进行分组。您可以通过显式设置组来覆盖此默认值,
last_plot() + aes(group=NA)