[R] Circular plot
Jim Lemon
drjimlemon at gmail.com
Tue Feb 14 00:04:58 CET 2017
Hi Swaraj,
As David pointed out, you can get the arcs without too much trouble:
library(plotrix)
mdf<-data.frame(score=c(-1,7,4,-7),start=c(0,0,600,800),
finish=c(100,200,800,1250))
par(mar=c(4,4,1,1))
plot(0,type="n",xlim=c(-20,20),ylim=c(-20,20),xlab="",ylab="",
xaxt="n",yaxt="n")
axis(1,at=c(-20,-10,0,10,20),labels=c(10,0,-10,0,10))
axis(2,at=c(-20,-10,0,10,20),labels=c(10,0,-10,0,10))
draw.circle(0,0,10,lty=2,border="black")
mlength<-1500
for(i in 1:dim(mdf)[1]) {
draw.arc(0,0,10+mdf$score[i],
angle1=2*pi*mdf$start[i]/mlength,
angle2=2*pi*mdf$finish[i]/mlength,
lwd=3,col=ifelse(mdf$score[i]<0,"red","blue"))
}
However, you may want a circular grid as well as clockwise angles:
par(mar=c(1,1,1,1))
plot(0,type="n",xlim=c(-6,6),ylim=c(-6,6),
xlab="",ylab="",axes=FALSE)
radial.grid(seq(0,1250,by=250),radial.lim=c(0,10),
label.pos=seq(0,12.5/15,by=2.5/15)*2*pi,
grid.pos=seq(0,12.5/15,by=2.5/15)*2*pi,
start=pi/2,clockwise=TRUE)
for(i in 1:dim(mdf)[1]) {
draw.arc(0,0,(10+mdf$score[i])/4.5,
deg1=450-360*mdf$start[i]/mlength,
deg2=450-360*mdf$finish[i]/mlength,
lwd=3,col=ifelse(mdf$score[i]<0,"red","blue"))
}
Both of these examples are pretty messy, but could be improved if you
have a lot of work like this.
Jim
On Tue, Feb 14, 2017 at 8:58 AM, swaraj basu <projectbasu at gmail.com> wrote:
> Thank you David, I could get the circle at 12 and clockwise however I
> believe my solution is not the optimal one, could you help me out with the
> best way to generate the circle clockwise at 12 and then convert the
> begin/stop to radians
>
> Here is what I tried
>
> par(mar=c(2,2,2,2),xpd=TRUE);
> plot(c(1,800),c(1,800),type="n",axes=FALSE,xlab="",ylab="",main="");
> DrawCircle (x=400,y=400,r.out = 400, r.in = 400, theta.1=1.57,
> theta.2=-2*pi-4.67, lwd=1)
>
> On Mon, Feb 13, 2017 at 6:52 PM, David L Carlson <dcarlson at tamu.edu> wrote:
>
>> You can do this easily with the DrawCircle() function in package
>> DescTools. It is easiest to use geometric coordinates (0 is at 3 o'clock
>> and moves counterclockwise around the circle), but it could be converted to
>> 12 o'clock and clockwise:
>>
>> library(DescTools)
>>
>> # Convert begin/stop to radians
>> dat$begin <- 0 + 2 * pi * dat$start/1500
>> dat$stop <- 0 + 2 * pi * dat$end/1500
>>
>> # Open blank plot window and draw circles
>> Canvas(xlim = c(-5,5), xpd=TRUE)
>> DrawCircle (r.out = 5, r.in = 5, theta.1=.05, theta.2=2*pi-.05, lwd=3)
>> with(dat, DrawCircle(r.out = 5 - score/5, r.in = 5 - score/5,
>> theta.1=begin, theta.2=stop, border=col, lwd=4))
>> text(5.2, .4, "1", pos=4)
>> text(5.2, -.4, "1500", pos=4)
>>
>> -------------------------------------
>> David L Carlson
>> Department of Anthropology
>> Texas A&M University
>> College Station, TX 77840-4352
>>
>>
>>
>>
>> -----Original Message-----
>> From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of swaraj
>> basu
>> Sent: Monday, February 13, 2017 10:34 AM
>> To: r-help at r-project.org
>> Subject: [R] Circular plot
>>
>> I want to plot segments deleted from mitochondrial DNA of patients with
>> neuromuscular disorders. I generate the plot on a linear chromosome using a
>> code similar to as shown below
>>
>> start<-c(1,5,600,820)
>> end<-c(250,75,810,1200)
>> score<-c(7,-1,4,-6.5)
>> dat<-data.frame(start=start,end=end,score=score,col="blue"
>> ,stringsAsFactors=F)
>> dat[dat$score<0,]$col<-"red"
>>
>> plot(1:1500,rep(0,1500),type="p",ylim=c(-10,10),col="white",
>> xlab="position",ylab="score")
>> segments(dat$start, dat$score, dat$end, dat$score, col=dat$col, lwd=3)
>>
>>
>> Since the human mitochondria is a circular genome, I would like to
>> visualise the plot generated above as a circle where all segments with
>> positive score lie inside the circle and those with negative score lie
>> outside. Attached is a representation of my requirement, although here it
>> is manually drawn. Can someone help me on this?
>>
>>
>> --
>> Swaraj Basu
>>
>
>
>
> --
> Swaraj Basu
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.
More information about the R-help
mailing list