getPolar = function(a,r,center=c(0,0)){
list(x=center[1]+cos(a)*r,y=center[2]+sin(a)*r)
}
psichart = function(x,labels = names(x),radius=0.4,spiral.shift=0,init.angle=0,col=rainbow(length(x)),border=FALSE,main='',center=NULL,tck.length = radius/10,N=200){
if(is.null(center)){
plot(0,type='n',axes=FALSE,ann=FALSE,xlim=c(0,1),ylim=c(0,1))
title(main=main)
center = c(0.5,0.5)
}
x = x/sum(x)*2*pi
angle = init.angle
for(i in 1:length(x)){
a = c(seq(from=angle,to=angle+spiral.shift,length.out = N),
seq(from=angle+spiral.shift,to=angle+spiral.shift+x[i],length.out = N),
seq(from=angle+spiral.shift+x[i],to=angle+x[i],length.out = N))
r = c(seq(from=0,to=radius,length.out = N),
rep(radius,N),
seq(from=radius,to=0,length.out = N))
color = col[(i %% length(col)) + 1]
polygon(getPolar(a,r,center),border = border,col = color)
if(!is.null(labels)){
a = rep(angle+spiral.shift+x[i]/2,2)
r = c(radius,radius + tck.length)
tck = getPolar(a,r,center)
lines(tck,col=color)
t = getPolar(a[1],r[2]+tck.length/3,center)
text(t$x,t$y,labels[i],adj=c(0.5-cos(a[1])/2,0.5-sin(a[1])/2))
}
angle = angle + x[i]
}
}
d = c(A=10,T=15,G=40,C=35)
par(mfrow=c(1,2),tck=-0.02,mgp=c(1.1,0.2,0),mar=c(0,0,1,0),oma=c(0,1,0,1))
a = 2
psichart(d,col=,border = F,spiral.shift = 0,init.angle= 0,main='Boring pie-chart')
psichart(d,col=,border = F,spiral.shift = 2,init.angle= 0,main='Enhansed psy-chart')

#
# setwd('~/tmp/psi')
# for(i in 0:200){
# cat('\r',i)
# png(paste(1000+i,'png',sep='.'),width = 12,height = 12,units = 'cm',res = 100)
# par(mfrow=c(2,2),tck=-0.02,mgp=c(1.1,0.2,0),mar=c(0,0,1,0),oma=c(0,1,0,1))
# a = i/2
# psichart(d,col=,border = F,spiral.shift = 0,init.angle= 0,main='Boring piechart')
# psichart(d,col=,border = F,spiral.shift = 2,init.angle= 0,main='Enhansed piechart')
# psichart(d,col=,border = F,spiral.shift = a,init.angle=-a,main='psi-chart')
# psichart(d,col=,border = F,spiral.shift = a,init.angle= 0,main='Boring piechart')
# dev.off()
# }