这是CJ在我的星球里分享的一个关于饼图的实现方式,代码的排版太差,还有一点是对于普通用户来说,还是有点难度,如果是我,必须是写成函数,直接出图。

pieplot <- function(x, y, width=1) { 
  yy <- cumsum(y)

  d= data.frame(ymin=yy-y + (1-width)/2, 
  	ymax=yy - (1-width)/2, 
  	group=x)

  ggplot(d) + 
  	geom_rect(aes(xmin=0, xmax=1, ymin=ymin, ymax=ymax, fill=group)) + 
  	coord_polar(theta='y') + theme_void() + ylim(0, NA)
}

那么上面这个函数,默认就是一般的饼图,如果要分开,那么就是设置width参数,如果想要中间空的,通过加xlim,正如我在《中空的环形树》一文中所介绍的。

x <- letters[1:5]
y <- 1:5

pieplot(x, y) 
pieplot(x, y, width=.8) 
pieplot(x, y, width=.5) 
pieplot(x, y) + xlim(-1, NA) 
pieplot(x, y) + xlim(-.5, NA) 
pieplot(x, y, width=.5) + xlim(-.5, NA) 

于是这6条指令,画出下面6个图:

然而正如CJ提到的,一旦中间空了,每一部分就不是扇形,底部不尖了,这当然是有解决方案的,请移步《邪恶的我画出了善良的饼图》。

library(ggforce)
d = data.frame(x=letters[1:5], y=1:5)
ggplot(d) + 
  geom_arc_bar(aes(x0=0, y0=0, r0=0, r=1, 
                  amount=y, fill=x, explode=.1), 
    stat='pie') + 
  coord_equal()