Please excuse me for asking such basic questions: Here is my code> y=c(1.21,0.51,0.14,1.62,-0.8,0.72,-1.71,0.84,0.02,-0.12) > ybar=mean(y) > ll=length(y); > ybarv=rep(ybar,ll) > x=1:ll > plot(x,ybarv,pch=1) > segments(x[1],ybar,x[ll],ybar)What I get is a collection of small circles, with a segment "on top" of the circles, which is almost what I want. But I don't want the segment to be visible inside any small circle. Is there an easy way to arrange for the segment to "lie behind" the pch=1 markers, as in hidden line removal, so that the circles remain with nothing inside them? I tried putting the segments command first, but then no segment appeared at all. In general, is there a method of laying a drawing "on top" of another. I tried inserting add="T" as an argument to plot, and R objected strongly. Thanks for any help David Epstein
On Sun, Jul 20, 2008 at 1:44 PM, David Epstein <David.Epstein at warwick.ac.uk> wrote:> Please excuse me for asking such basic questions: > > Here is my code >> >> y=c(1.21,0.51,0.14,1.62,-0.8,0.72,-1.71,0.84,0.02,-0.12) >> ybar=mean(y) >> ll=length(y); >> ybarv=rep(ybar,ll) >> x=1:ll >> plot(x,ybarv,pch=1) >> segments(x[1],ybar,x[ll],ybar) > > What I get is a collection of small circles, with a segment "on top" of the > circles, which is almost what I want. But I don't want the segment to be > visible inside any small circle. > > Is there an easy way to arrange for the segment to "lie behind" the pch=1 > markers, as in hidden line removal, so that the circles remain with nothing > inside them? I tried putting the segments command first, but then no segment > appeared at all. > > In general, is there a method of laying a drawing "on top" of another. I > tried inserting add="T" as an argument to plot, and R objected strongly.What about replacing segments(x[1],ybar,x[ll],ybar) plot(x,ybarv,pch=1) with plot(x,ybarv,type="b") ? Paul
You probably want to make your code readable, read ?points and go ahead by making the plot without points (plot(....., type="n")), drawing segments and at the end paint points with white background colour in order to "overwrite" the segments: y <- c(1.21, 0.51, 0.14, 1.62, -0.8, 0.72, -1.71, 0.84, 0.02, -0.12) ybar <- mean(y) ll <- length(y) ybarv <- rep(ybar, ll) x <- 1:ll plot(x, ybarv, type="n") segments(x[1], ybar, x[ll], ybar) points(x, ybarv, pch=21, bg="white") Uwe Ligges David Epstein wrote:> Please excuse me for asking such basic questions: > > Here is my code >> y=c(1.21,0.51,0.14,1.62,-0.8,0.72,-1.71,0.84,0.02,-0.12) >> ybar=mean(y) >> ll=length(y); >> ybarv=rep(ybar,ll) >> x=1:ll >> plot(x,ybarv,pch=1) >> segments(x[1],ybar,x[ll],ybar) > > What I get is a collection of small circles, with a segment "on top" of > the circles, which is almost what I want. But I don't want the segment > to be visible inside any small circle. > > Is there an easy way to arrange for the segment to "lie behind" the > pch=1 markers, as in hidden line removal, so that the circles remain > with nothing inside them? I tried putting the segments command first, > but then no segment appeared at all. > > In general, is there a method of laying a drawing "on top" of another. I > tried inserting add="T" as an argument to plot, and R objected strongly. > > Thanks for any help > > David Epstein > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.
Dear Mr. Epstein, This is another solution, two commands have been added to your own code: y=c(1.21,0.51,0.14,1.62,-0.8,0.72,-1.71,0.84,0.02,-0.12) ybar=mean(y) ll=length(y); ybarv=rep(ybar,ll) x=1:ll plot(x,ybarv,pch=1) segments(x[1],ybar,x[ll],ybar) ## cover the points with other points completely white: points(x,ybarv,pch=16,col='white') ## just write a black border over the white points (with pch=1) points(x,ybarv,pch=1,col='black') The two new commands are layered on top of the previous ones. To write "on top" of a plot command, use the points command. Regards, Paulo Barata ---------------------------------------------------------------- Paulo Barata Fundacao Oswaldo Cruz - Oswaldo Cruz Foundation Rua Leopoldo Bulhoes 1480 - 8A 21041-210 Rio de Janeiro - RJ Brazil E-mail: pbarata at infolink.com.br Alternative e-mail: paulo.barata at ensp.fiocruz.br ---------------------------------------------------------------- >Message: 14 >Date: Sun, 20 Jul 2008 13:44:27 +0100 >From: David Epstein <David.Epstein at warwick.ac.uk> >Subject: [R] drawing segments through points with pch=1 >To: r-help at r-project.org >Message-ID: <B7CC24E1-9022-42F1-9BE2-914E73A22A60 at warwick.ac.uk> >Content-Type: text/plain; charset=US-ASCII; delsp=yes; format=flowed > >Please excuse me for asking such basic questions: > >Here is my code >> > y=c(1.21,0.51,0.14,1.62,-0.8,0.72,-1.71,0.84,0.02,-0.12) >> > ybar=mean(y) >> > ll=length(y); >> > ybarv=rep(ybar,ll) >> > x=1:ll >> > plot(x,ybarv,pch=1) >> > segments(x[1],ybar,x[ll],ybar) > >What I get is a collection of small circles, with a segment "on top" >of the circles, which is almost what I want. But I don't want the >segment to be visible inside any small circle. > >Is there an easy way to arrange for the segment to "lie behind" the >pch=1 markers, as in hidden line removal, so that the circles remain >with nothing inside them? I tried putting the segments command first, >but then no segment appeared at all. > >In general, is there a method of laying a drawing "on top" of >another. I tried inserting add="T" as an argument to plot, and R >objected strongly. > >Thanks for any help > >David Epstein
David Epstein <David.Epstein at warwick.ac.uk> wrote:> Please excuse me for asking such basic questions: > > Here is my code > > y=c(1.21,0.51,0.14,1.62,-0.8,0.72,-1.71,0.84,0.02,-0.12) > > ybar=mean(y) > > ll=length(y); > > ybarv=rep(ybar,ll) > > x=1:ll > > plot(x,ybarv,pch=1) > > segments(x[1],ybar,x[ll],ybar) > > What I get is a collection of small circles, with a segment "on top" > of the circles, which is almost what I want. But I don't want the > segment to be visible inside any small circle. > > Is there an easy way to arrange for the segment to "lie behind" the > pch=1 markers, as in hidden line removal, so that the circles remain > with nothing inside them? I tried putting the segments command first, > but then no segment appeared at all.Try using pch = 21 and the "bg" parameter to set the fill color. That lets you set the background color of the circle so that it will conceal the line segment. In general in R graphics, objects are drawn in the order specified. However, the default background of plotting symbols is transparent, so in your case, the order doesn't matter. -- Mike Prager, NOAA, Beaufort, NC * Opinions expressed are personal and not represented otherwise. * Any use of tradenames does not constitute a NOAA endorsement.