我想创建一个图表,根据变量的因子填充行之间的区域。我希望多边形在行[1A060:1A9D4][2016-04-06T10:12:09]e000: Error 0x80070643: Failed to install MSI package.
[1A060:1A9D4][2016-04-06T10:12:09]e000: Error 0x80070643: Failed to execute MSI package.
[1AD24:1D73C][2016-04-06T10:12:09]e000: Error 0x80070643: Failed to configure per-machine MSI package.
[1AD24:1D73C][2016-04-06T10:12:09]i319: Applied execute package: InstallationPackage, result: 0x80070643, restart: None
[1AD24:1D73C][2016-04-06T10:12:09]e000: Error 0x80070643: Failed to execute MSI package.
时为红色,在ya > yb
时为绿色。
yb > ya
这根本不起作用:
xa <- c(1,2,3,4,5,6)
ya <- c(1,10,15,7,12,3)
xb <- c(1,2,3,4,5,6)
yb <- c(5,10,14,12,2,11)
toyset <- as.data.frame(cbind(xa, ya, xb, yb))
toyset$color<-ifelse(toyset$yb>ya,"green","red")
poly_df <- rbind(setNames(toyset[,c(1,2,5)],c('x','y','color')),
setNames(toyset[6:1,3:5],c('x','y','color')))
这里的多边形没问题,但没有不同的颜色(见图):
ggplot(toyset) +
geom_line(aes(xa, ya), colour="red") +
geom_line(aes(xb, yb), colour="green") +
geom_polygon(data = poly_df,aes(x = x,y = y,fill=poly_df$color))
答案 0 :(得分:1)
按照此blog中的示例,您可以按照以下步骤操作。
我们使用初始玩具数据集(略微调整)
x1 <- c(1, 2, 3, 4, 5, 6)
y1 <- c(1, 10, 15, 7, 12, 3)
y2 <- c(5, 10, 14, 12, 2, 11)
toyset <- as.data.frame(cbind(x1, y1, y2))
为了改变两条线交叉的每个点的填充颜色,我们计算交点。
toyset$slope1 <- c(NA, with(toyset, diff(y1)/diff(x1)))
toyset$slope2 <- c(NA, with(toyset, diff(y2)/diff(x1)))
toyset$intcpt1 <- with(toyset, y1 - slope1 * x1)
toyset$intcpt2 <- with(toyset, y2 - slope2 * x1)
toyset$x2 <- with(toyset, (intcpt1 - intcpt2)/(slope2 - slope1))
toyset$y3 <- with(toyset, slope1 * x2 + intcpt1)
toyset <- toyset[, c(-4:-7)]
为了确保计算正确,我们可以直观地检查交叉点的位置:
ggplot(toyset) + geom_line(aes(x1, y1), colour = "red") +
geom_line(aes(x1, y2), colour = "darkgreen") +
geom_point(aes(x2, y3), colour = "darkblue", size = 3)
由于我们将使用geom_ribbon
,因此交叉点也需要以geom_ribbon(x, ymin, ymax)
所期望的形式呈现 - y3
的简单副本即可实现此目的。
toyset$y4 <- toyset$y3
我们执行额外的错误检查,并将每个数据点分配到适当的时间间隔。
toyset[which(toyset$x2 > toyset$x1), c("x2", "y3", "y4")] <- NA
toyset$segment <- findInterval(toyset$x1,
c(min(toyset$x2, na.rm = TRUE),
toyset$x2[which(!is.na(toyset$x2))]))
要使ggplot2
能够改变每条线交叉处的填充颜色,需要知道每个彩色区域的起点和终点。这意味着交叉点的中间点需要重复,因为它们是两个相邻区域的一部分,填充了不同的颜色。
toyset$x3 <- c(tail(toyset$x2, -1), NA)
toyset$y5 <- c(tail(toyset$y3, -1), NA)
toyset$y6 <- toyset$y5
现在需要将两条线的坐标和彩色区域的起点/终点组合成一个长格式的data.frame。
toyset1 <- toyset[, c(1:3, 7)]
toyset2 <- toyset[!is.na(toyset$x2), c(4:6, 7)]
toyset3 <- toyset[!is.na(toyset$x3), c(8:10, 7)]
names(toyset2) <- names(toyset1)
names(toyset3) <- names(toyset1)
combo <- rbind(toyset1, toyset2)
combo <- rbind(combo, toyset3)
combo <- combo[is.finite(combo$y1), ]
combo <- combo[order(combo$x1), ]
我们现在可以相应地填写细分。
ggplot(combo, aes(x1, ymin = y1, ymax = y2))+
geom_ribbon(aes(fill = factor(segment%%2)), alpha = 0.5) +
geom_path(aes(y = y1), colour = "red", size = 1) +
geom_path(aes(y = y2), colour = "darkgreen", size = 1) +
scale_fill_manual(values = c("red", "green"))