[R] Circular plot

David L Carlson dcarlson at tamu.edu
Tue Feb 14 17:53:24 CET 2017


This is pretty close to your original plot. To get clockwise we multiply the radians by -1 and then add pi/2 to move the origin to 12 o'clock. We need to flip the start and end values since now we are be plotting from the end to the start:

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"

# Convert begin/stop to radians
dat$stop <- -(2 * pi * dat$start/1500) + pi/2
dat$begin <- -(2 * pi * dat$end/1500) + pi/2

# Open blank plot window and draw circles
Canvas(xlim = c(-5,5), xpd=TRUE)
DrawCircle (r.out = 5, r.in = 5, theta.1=pi/2+.05, theta.2=pi*5/2-.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(.1, 5.5, "1", pos=4)
text(-.1, 5.5, "1500", pos=2)

David C


From: swaraj basu [mailto:projectbasu at gmail.com] 
Sent: Monday, February 13, 2017 3:58 PM
To: David L Carlson <dcarlson at tamu.edu>; r-help at r-project.org
Subject: Re: [R] Circular plot

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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: mtDNAplot.png
Type: image/png
Size: 5065 bytes
Desc: mtDNAplot.png
URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20170214/5e64683a/attachment.png>


More information about the R-help mailing list