затенение определенной области на графике-комбинация линий и точечных участков в базе R

у меня следующий вопрос:

set.seed(1234)
dis = seq(1, 800, 10)
 yvar = rnorm(length (dis), 50, 10)
myd <- data.frame (xvar = dis, yvar = yvar, yvarL = 
yvar - rnorm (length (yvar),5, 1), yvarU = yvar + rnorm (length (yvar), 5, 1))
plot(myd$xvar,myd$yvar,pch=19,cex=.75,col="blue")
points(myd$xvar,myd$yvarL,col="gray", pch=19,cex=.5)
points(myd$xvar,myd$yvarU,col="gray", pch=19,cex=.5)

Y имеет три значения-y, верхнюю и нижнюю уверенность. Я хотел бы затенить между двумя интервалами в оси. Остальная часть графика будет только точкой. Гипотетический график продукта должен быть похожим (не совсем).

enter image description here

Как я могу затенять и создавать линейный график между двумя интервалами, скажем, между 650 до 690 и 210 до 280 в myd$xvar. Я попытался сделать подгонку полигота на основе этого сообщения (затенение в пределах графика кривой xy в R), но не увенчались успехом.

polygon(c(myd$xvar[1:200], myd$xvar[200:1]), c(myd$xvar[1:200],
   myd$yvar[200:1]), col="gray")

2 ответов


аналогичный ответ Стефану:

plot(myd$xvar,myd$yvar,pch=19,cex=.75,col="blue")
points(myd$xvar,myd$yvarL,col="gray", pch=19,cex=.5)
points(myd$xvar,myd$yvarU,col="gray", pch=19,cex=.5)
polygon(c(smyd$xvar[1:nrow(smyd)], smyd$xvar[nrow(smyd):1]), 
 c(smyd$yvarL[1:nrow(smyd)], smyd$yvarU[nrow(smyd):1]), col="gray", border = NA)
points(smyd$xvar,smyd$yvar,col="red", pch=19,cex=1.5)
lines (smyd$xvar,smyd$yvar,col="red", pch=19,cex=1.5)

polygon(c(smyd1$xvar[1:nrow(smyd1)], smyd1$xvar[nrow(smyd1):1]),
c(smyd1$yvarL[1:nrow(smyd1)], smyd1$yvarU[nrow(smyd1):1]), col="yellow", border = NA)
points(smyd1$xvar,smyd1$yvar,col="green4", pch=19,cex=1.5)
lines (smyd1$xvar,smyd1$yvar,col="green4", pch=19,cex=1.5)

дает вам: enter image description here


одна из проблем с вашими данными заключается в том, что myd имеет только 80 наблюдений, но вы пытаетесь построить 200... Просто введите переменную x дважды в polygon() (один раз как есть, один раз в обратном порядке), затем переменная y (сначала нижний предел как есть, Затем верхний предел в обратном порядке). Тогда у вас есть затенение:

polygon(c(myd$xvar[20:40], myd$xvar[40:20]),c(myd$yvarL[20:40],
 myd$yvarU[40:20]), col="gray")

тем не менее, затенение будет охватывать некоторые точки, поэтому вам придется их перестроить:

points(myd$xvar,myd$yvar,pch=19,cex=.75,col="blue")
points(myd$xvar,myd$yvarL,col="gray", pch=19,cex=.5)
points(myd$xvar,myd$yvarU,col="gray", pch=19,cex=.5)

EDIT: rfan ниже просит затенить на основе x координата, а не индекс, и для добавления линии в затененную область. Для этого имеет смысл извлечь индекс соответствующих точек (мы используем сортировку myd$xvar):

index <- which(myd$xvar>=200 & myd$xvar<=400)

затем мы строим график на основе этого индекса, который мы можем легко изменить, если нам нужно:

polygon(c(myd$xvar[index], myd$xvar[rev(index)]),c(myd$yvarL[index], 
 myd$yvarU[rev(index)]), col="gray")

теперь добавьте линию и дополнительные точки:

lines(myd$xvar[index],myd$yvar[index],pch=19,cex=.75,col="blue",type="o")
points(myd$xvar,myd$yvarL,col="gray", pch=19,cex=.5)
points(myd$xvar,myd$yvarU,col="gray", pch=19,cex=.5)