我有两张图显示供求关系,还有一张图,我从供应中减去需求以显示由此产生的不对称性。我想对 x 轴和不对称负部分之间的区域进行阴影处理,以显示缺陷的程度。
我目前使用以下代码:
plot.asymmetry <- ggplot(data=df.overview.month,
aes(x=Date.Time, y=Asymmetry)) +
geom_area(data=subset(df.overview.month, Asymmetry < 0),
aes(x=Date.Time, y=Asymmetry))
然而 - 正如预期的那样 - 这不会遮蔽 geom_line 和 x 轴之间的区域,而只会遮蔽不对称数据的负值,这完全是另一回事,如结果图所示:
有没有办法克服这个问题?
/编辑:一些示例数据:
time.initial <- as.POSIXct("2010-12-31 23:00:00", tz="GMT")
Date.Time<-vector()
for(i in 1:24) {
Date.Time[i] <- time.initial + i*3600
}
Demand<-vector()
for(i in 0:23) {
Demand[i+1] <- 155 + 20*sin((pi/12)*i - (pi/2)) + 10*sin((pi/4380)*i + (pi/2))
}
Supply<-vector()
for(i in 0:23) {
Supply[i+1] <- 165 + 5*sin((pi/4380)*i - (pi/2)) + rnorm(1, mean=0, sd=0.20*165)
}
df.overview.month <- data.frame(Date.Time, Demand, Supply, Asymmetry=Supply-Demand)
最佳答案
这作为灵感怎么样。现在,您只需要添加不对称性为零的其他数据点(如@baptiste 建议的那样)。当不对称性高于零时,我创建了一个新的 NA
列,这样就不会在那里绘制 geom_ribbon。仅对数据进行子集化不会导致所需的绘图。
df.overview.month$Assym_ribbon = ifelse(df.overview.month$Asymmetry > 0,
NA,
df.overview.month$Asymmetry)
ggplot(aes(x = Date.Time, y = Asymmetry),
data = df.overview.month) +
geom_line() +
geom_ribbon(aes(ymin = 0, ymax = Assym_ribbon),
data = , fill = "red")
关于您构建示例的方式的一些附加说明。最重要的一点是 R 是矢量化的。例如:
set.seed(1)
Supply<-vector()
for(i in 0:23) {
Supply[i+1] <- 165 +
5*sin((pi/4380)*i -
(pi/2)) +
rnorm(1, mean=0, sd=0.20*165)
}
相当于:
set.seed(1)
i = 0:23
Supply_vec <- 165 + 5*sin((pi/4380)*i -
(pi/2)) +
rnorm(length(i), mean=0, sd=0.20*165)
> all.equal(Supply_vec, Supply)
[1] TRUE
在这种情况下,代码的减少是适度的,但在其他(更现实的)设置中,使用矢量化将为您节省数十行代码。
关于r - 对 geom_line 和 x 轴之间的区域进行着色,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9973381/