我有两张图显示供求关系,还有一张图,我从供应中减去需求以显示由此产生的不对称性。我想对 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/

10-09 10:16