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.