使用 ggplot 修复饼图的正确布局

Fixing the proper layout of pie chart using ggplot

我对指定饼图布局的可能性有疑问。让我们来看看下面的代码

pie_chart=function(vec,save){
      if (class(vec)=='numeric'){vec<-as.character(vec)
      vec<-print(paste('var',vec))
      }
      df<-data.frame(table(vec))
      colnames(df)[1]<-'group'
      bp<- ggplot(df, aes(x="", y=Freq, fill=group))+
        geom_bar(width = 1, stat = "identity")
      blank_theme <- theme_minimal()+
        theme(
          axis.title.x = element_blank(),
          axis.title.y = element_blank(),
          panel.border = element_blank(),
          panel.grid=element_blank(),
          axis.ticks = element_blank(),
          plot.title=element_text(size=14, face="bold")
        )
      
      pie <- bp + coord_polar("y", start=0)
      pie + scale_fill_brewer("Characteristic") + blank_theme +
        theme(axis.text.x=element_blank())+
        geom_text(aes(y = Freq/3 + c(0, cumsum(Freq)[-length(Freq)]), 
                      label = print(paste0(Freq,'(',percent(Freq/(sum(Freq))),')'))), size=5)
    }
    pie_chart(c(rep(1,50),rep(2,60),rep(3,26),rep(4,24)))

如上图所示,标签的放置方式很奇怪。有什么简单的方法可以让我将它们集中到 'middle of part of the pie' 中吗?

提前致谢!

ygeom_text(aes) 更改为:

geom_text(aes(y = rev(Freq)/2 + c(0, cumsum(rev(Freq))[-length(Freq)]),
          label = print(paste0(rev(Freq),'(',percent(rev(Freq)/(sum(Freq))),')'))), size=5)

根据 Vincent 的评论,我删除了极坐标。我能够看到您的 Freq 值顺序相反,因此它们的相对间距是正确的,但它们的绝对位置是错误的。请注意,为了清楚起见,我简化了标签。

为了让它们在正确的位置,我首先使用rev()来反转计算中的Freq。这将标签放在大致正确的位置,但顺序仍然错误:

然后,我在label审美中使用了rev,现在一切都很好。我还除以 2 而不是 3,以使块中的标签居中。

最后,把极坐标放回去,我们得到: