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()
# }