R语言三种方法绘制饼图

作者: Whuer_deng | 来源:发表于2019-08-17 13:55 被阅读196次
    R语言中绘制饼图,有基础绘图包的pie()函数,但是做出来的图不够美观。ggplot2及其拓展包做出来的图美观。下面提供三种以ggplot2及其拓展包绘制饼图的方法。

    以mtcars数据集为例子,要查看32辆车中Cylinders数的分布情况。

    一、常见的先绘制条图,再用coord_polar()转换成饼图

    数据准备,第一、二种方法需要。

    data("mtcars")#加载数据
    table <- table(mtcars$cyl) #计算频数
    table
     4  6  8 
    11  7 14 
    data <- as.data.frame(table) #将频数表转换成数据框
    data
      Var1 Freq
    1    4   11
    2    6    7
    3    8   14
    colnames(data) <- c('Cylinders', 'Freq') #修改数据框的列名
    data
      Cylinders Freq
    1         4   11
    2         6    7
    3         8   14
    percentage <- scales::percent(data$Freq / sum(data$Freq)) #计算百分比,利用scales包的percent()函数,将计算的小数比例转换成百分数
    percentage
    [1] "34.4%" "21.9%" "43.8%"
    labs <- paste(data$Cylinders, '-Cylinders', '(', percentage, ')', sep = '')#设置标签名
    labs
    [1] "4-Cylinders(34.4%)" "6-Cylinders(21.9%)" "8-Cylinders(43.8%)"
    
    library(ggplot2)
    library(magrittr)
    #绘制条图
    p1 <- data %>% 
      ggplot(aes(x = '', y = Freq, fill = Cylinders)) + 
      geom_bar(stat = 'identity', width = 1) + 
      geom_text(aes(y = c(5, 18, 25), label = labs)) + #y = ?设置标签所在的位置,如果不设置y = ?,y会默认为坐标值,所有标签位置会发生偏移。
      theme_bw() + 
      labs(x = '', y = '',title = 'Number of cars in different Cylinders') #清除x-y轴的标题,设置主标签。
    p1
    
    image.png

    不设置aes(y = ?),条图标签的位置

    data %>% 
      ggplot(aes(x = '', y = Freq, fill = Cylinders)) + 
      geom_bar(stat = 'identity', width = 1) + 
      geom_text(aes(label = labs)) +  #未设置y
      theme_bw() + 
      labs(x = '', y = '',title = 'Number of cars in different Cylinders') 
    
    image.png

    用coord_polar()转换成饼图

    p2 <- p1 + coord_polar(theta = 'y', start = 0, direction = 1) #direction = 1,顺时针,direction = -1, 逆时针方向。
    p2
    
    第一种方法:ggplot2::coord_polar().png

    不设置aes(y = ?),饼图标签的位置

    data %>% 
      ggplot(aes(x = '', y = Freq, fill = Cylinders)) + 
      geom_bar(stat = 'identity', width = 1) + 
      geom_text(aes(label = labs)) + #未设置y
      theme_bw() + 
      labs(x = '', y = '',title = 'Number of cars in different Cylinders')  + 
        coord_polar(theta = 'y', start = 0, direction = 1)
    
    不设置y的情况.png

    二、利用ggpubr包的ggpie()

    library(ggpubr)
    p3 <- ggpie(data, 'Freq',  #绘图,只用写频数就行,切记不用再写分组
          fill = 'Cylinders', palette = 'jco', #安装Cylinders填充,颜色板为jco.
          label = labs, lab.pos = 'in', lab.font = c(4, 'white')) #设置标签,标签的位置在图的内部,标签的大小为4, 颜色为白色.
    p3
    
    image.png
    #用ggpar()修改图形
    p4 <- ggpar(p3, title = 'Number of cars in different Cylinders',#设置标题
          legend = 'right', #设置图例位置
          orientation = 'reverse')#反转绘图的方向为逆时针方向。
    p4
    
    第二种方法:ggpubr::ggpie().png

    三、ggstatsplot::ggpiestats()

    library(ggstatsplot)
    p5 <- ggpiestats(mtcars, 'cyl', 
               results.subtitle = F, #标题中不显示统计结果
               factor.levels = c('4 Cylinders', '6 Cylinders', '8 Cylinders'),#设置标签的名称
               slice.label = 'percentage', #设置饼图中标签的类型(默认percentage:百分比, 还有counts:频数, both : 频数和百分比都显示)
               perc.k = 2, #百分比的小数位数为2
               direction = 1, #1为顺时针方向,-1为逆时针方向
               palette = 'Pastel2', #设置调色板
               title = 'Number of cars in different Cylinders'#设置标题)
    p5
    
    第三种方法:ggstatsplot::ggpiestats().png

    三种方法比较:

    第一种方法需要手动设置标签的位置,反复地调,直到合适为止,比较麻烦。

    第二种方法不需要手动设置标签位置,自动在图中展示好,比第一种方法好点儿。

    前两种方法需要对数据进行频数计算等操作做数据准备工作,第三种方法直接利用原数据,不需要数据准备工作,方便快捷。

    相关文章

      网友评论

        本文标题:R语言三种方法绘制饼图

        本文链接:https://www.haomeiwen.com/subject/hqnhsctx.html