ggplot - 制作饼图

ggplot - Making pie graph

我有一个df(命名为:cant_masivos_trim)如下:

            Descripcion Freq
    Cargos Jubilaciones 2185
      Faltantes de Caja  470
        ATM Diferencias  201
   Previsiones Legales   34
  Gastos Corresponsalía   22
          Multas SICORE   19
               Sumarios   17
            ATM Fraudes   10
           Multas ANSeS    7
            Multas AFIP    5

我想用 ggplot2 创建一个饼图,我的标签有问题,如图所示。

我不知道为什么标签不在正确的位置,我想不通。

我使用的代码:

pmas <- ggplot(cant_masivos_trim, aes(x=1, y=Freq, fill=Descripcion)) +
        geom_bar(stat="identity") +
        ggtitle(paste("Cantidad de Reportes - Carga Masiva"))
pmas <- pmas + coord_polar(theta='y')
pmas <- ggplot(cant_masivos_trim, aes(x=1, Freq, fill=Descripcion)) +
        ggtitle(paste("Cantidad de Reportes - Carga Masiva")) +
        coord_polar(theta='y')
pmas <- pmas + geom_bar(stat="identity", color='black') + guides(fill=guide_legend(override.aes=list(colour=NA)))
pmas <- pmas + theme(axis.ticks=element_blank(),  # the axis ticks
          axis.title=element_blank(),  # the axis labels
          axis.text.y=element_blank()) # the 0.75, 1.00, 1.25 labels.
y.breaks <- cumsum(cant_masivos_trim$Freq) - cant_masivos_trim$Freq/2
pmas <- pmas +
    # prettiness: make the labels black
    theme(axis.text.x=element_text(color='black')) +
    scale_y_continuous(
        breaks=y.breaks,   # where to place the labels
        labels= (paste(cant_masivos_trim$Freq, percent(cant_masivos_trim$Freq/sum(cant_masivos_trim$Freq)), sep='\n'))) # the labels

谁能帮帮我?谢谢!

这与默认情况下绘制饼图切片的顺序有关。通过查看条形图(coord_polar 之前)最容易了解发生了什么。 ggplot2 条形图根据 Descripcion 因子的水平顺序从上到下绘制。

要计算中断,您需要在计算累积频率之前按 Descripcion 对数据集进行排序。要匹配默认的 ggplot2 顺序,您可以按变量的 reverse 进行排序。

cant_masivos_trim = cant_masivos_trim[rev(order(cant_masivos_trim$Descripcion)), ]

完成后,根据累积频率计算中断并像以前一样将它们居中。

y.breaks = cumsum(cant_masivos_trim$Freq) - cant_masivos_trim$Freq/2

ggplot(cant_masivos_trim, aes(x  =1, y = Freq, fill = Descripcion)) +
    geom_bar(stat="identity") +
    coord_polar(theta = "y") +
    scale_y_continuous(breaks = y.breaks,   # where to place the labels
        labels = (paste(cant_masivos_trim$Freq, 
                     scales::percent(cant_masivos_trim$Freq/sum(cant_masivos_trim$Freq)), sep='\n'))) +
    theme(legend.position = "none",
         axis.ticks=element_blank(),  
         axis.title=element_blank(),  
         axis.text.y=element_blank())