2012-10-24 13 views
6

Ho seguente domanda:ombreggiatura certa area sul grafico - una combinazione di linee e terreni puntiformi di base 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 ha tre valori - Y, fiducia superiore e inferiore. Vorrei sfumare tra due intervalli in asse. Il resto del grafico sarebbe solo il punto. Il grafico del prodotto ipotizzato dovrebbe essere simile (non esattamente).

enter image description here

Come posso ombra e la trama linea di prodotti tra due intervalli dire tra 650-690 e 210-280 in myd $ variabile-x. Ho provato a fare un po 'di raccordo poligonale basato su questo post (shading within xy curve plot in R), ma non ha avuto successo.

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

Potrebbe essere necessario sottoinsieme di dati e le trame per alcuni punti, mentre per gli altri – SHRram

risposta

2

risposta simile a Stephan:

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) 

ti dà: enter image description here

4

Un problema con i dati è che myd ha solo 80 osservazioni, ma si sta cercando di tracciare 200 ... Basta alimentare la variabile x due volte in polygon() (una volta come-è, una volta in ordine inverso), quindi la variabile y (prima il limite inferiore così com'è, quindi il limite superiore in ordine inverso). Allora avete la vostra shading:

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

Tuttavia, l'ombreggiatura coprirà alcuni punti, in modo da avere a ri-plot loro:

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 seguito chiede di tonalità in base alla x coordinare, non l'indice e aggiungere una linea nella regione ombreggiata. Per questo, ha senso per estrarre un indice dei punti rilevanti (usiamo che myd $ variabile-x è ordinato):

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

Abbiamo poi trama basata su questo indice, che siamo in grado di modificare facilmente se abbiamo bisogno di:

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

Ora, aggiungere una riga e i punti aggiuntivi:

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) 
+0

grazie, come posso trama per Yvar nella regione ombreggiata solo (si veda la figura modello). Possiamo impostare il margine con 200 in xvar (non il 20esimo valore), in questo modo sarebbe molto più semplice ombreggiare determinate regioni in base al valore xvar – fprd

+0

@rfan: ho modificato la risposta in base alla tua domanda. questo aiuta? –

+0

sì, questo è sicuramente ciò di cui ho bisogno ... trovare l'indice è talvolta difficile rispetto ai punti di taglio X – fprd