我是R的新手,试图有条理地在折线图中绘制垂直条。我正在使用基础R图形。
我从中获取数据的数据帧称为RW1,我在同一图中的两个y轴上绘制了RW1的两个变量。共有2718条意见
现在,我想添加垂直排列的灰色阴影条,这取决于" RW1 $ Measured_CH1_CTT"的标准偏差。该变量绘制在左侧y轴(侧面2)上。也就是说,只要连续八次观测中的标准偏差等于或小于0.5,就应该为这些观测值绘制一个垂直条。
我试图用for循环和嵌入if语句写这个但是有点挣扎。这是我到目前为止所得到的。
# Set values outside loop
xi <- 0
xj <- 0
n <- nrow(RW1)
# Run the loop
for (i in 1:n) {
for (j in min(i+8, n-i))
Measured_CH1_CTT = RW1$Measured_CH1_CTT[i:(i+j)]
if (sd(Measured_CH1_CTT <= 0.5)) {
xi <- i
xj <- j
rect(xleft = xi, xright = xj, ybottom = -0.6, ytop = 0.6, density = 100, col = "grey")
}
}
关键点是
欢呼任何建议!
编辑:由于变量中缺少值,我在parantheses中指定了na.rm参数,并将&#39;低于等于&#39;正确表达:if (sd(Measured_CH1_CTT, na.rm = TRUE) <= 0.5)
。这就产生了if语句missing value where TRUE/FALSE needed
的另一个错误
问题的关键在于区间的定义和/或xi
和xj
的分配。我独立地执行了if()
函数(使用另一个简单的表达式)并且它可以工作。同样,rect()
功能在我手动指定xleft
和xright
时有效。
答案 0 :(得分:0)
好的,它花了我一段时间,但我想出了一些帮助。一般问题是使用i
和j
定义区间。不需要嵌套循环。我已经假设正确指定了rect()
函数。我必须在!is.na(sd_temp)
语句中添加if()
。
正确的语法如下所示(名称调整为更一般的理解):
# Add vertical shaded bars
n <- nrow(df) - 7
for (i in 1:n) {
j = i + 7
y_temp = df$y[i:j]
sd_temp <- sd(y_temp, na.rm = TRUE)
if (!is.na(sd_temp) & sd_temp <= 0.5) {
rect(xleft = i, xright = j, ybottom = min.length_y, ytop = max.length_y, density = NA, col = "gray94")
} else {
next
}
}
也许这对其他人有帮助。
警告:在R中,循环一般都有点慢。虽然这个特定的循环只有2700次迭代,但处理速度非常快(!),我不得不在20分钟后中止它。我认为当一个循环与这种情况下的绘图函数结合时,R会更加挣扎。