二、描述变量比例的可视化图形
    (一)饼图绘制
       饼图,是将总体看作一个圆,按照各分类的占比情况将圆划分成大小不同的扇形,以弧度的大小来表示某一分类的占比。饼图可以快速了解各分类的情况,但一般分类的数量不能太多,否则会导致圆被切割为很多块,不利于展示在饼图中,另外通常会将占比最大的分类放置在最显眼的地方,即 12 点钟方向的右边,而第二大占比放置在 12 点钟方向的左边。其余分类依据逆时针方向放置。
       在 R 中,使用将正数作为向量输入的 pie()函数创建饼图。
       示例:pie(x, labels = names(x), edges = 200, radius = 0.8, clockwise = FALSE, init.angle = 
if(clockwise) 90 else 0, density = NULL, angle =, col = NULL, border = NULL, lty = NULL, main = 
NULL, …)绘制的饼图如图 6-2-23 和图 6-2-24 所示。
       参数设置说明:
       ● x: 数值向量,表示每个扇形的面积。
       ● labels: 字符型向量,表示各扇形面积标签。
       ● radius: 饼图的半径。
       ● main: 饼图的标题。
       ● clockwise: 是一个逻辑值,用来指示饼图各个切片是否按顺时针做出分割。
       ● angle: 设置底纹的斜率。
       ● density: 底纹的密度,默认值为 NULL。
       ● col: 表示每个扇形的颜色,相当于调色板。
       # library 
       library(ggplot2) 
       library(dplyr) 
       library(forcats) 
       library(patchwork) 
       library(hrbrthemes) 
       library(echarts4r) 
       library(ggforce) 
      # 建立扇形面积大小向量,数据来源:国家统计局 2021 年居民消费支出数据
      a <- c(2115,2599,3156,1423,5641,1419,7178,569) 
      # 建立扇形标签名称向量 y
      b <- c("医疗保健","教育文化娱乐","交通通信","生活用品服务","居住","衣着","食品烟酒
      ","其他") 
      # 扇形颜色设置
      c <- c('#E5D2DD', '#53A85F', '#F1BB72', '#D6E7A3', '#57C3F3', '#476D87', '#E59CC4', 
      '#BD956A') 
      #将扇形面积四舍五入保存为一位小数
       d <- paste(round(100*a/sum(a), 1), "%") 
       pie(a, 
             labels=d, # 扇形标签,labels =b,或者
             main ="2021 年居民消费支出结构" , # 图片标题
             radius=0.8 , # 饼图大小设置
             clockwise = T, 
             border="white",# 饼图外沿颜色设置
             col=c
              ) 
        legend("topright",b,cex=0.6,fill=c) 
        pie(a,labels=b,radius=0.8,density=30,angle=c(20,10,90,50,80,30,10,0),main ="2021 年居民
        消费支出结构" )       # 参数 angle 控制饼图条纹显示
                                                       6-2-23 2021 年居民消费支出结构饼图
                                                              图 6-2-24 条纹格式显示的饼图
         # 使用 ggplot2 绘制饼图,数据为 R 软件自带的演示数据,绘制的饼图如图 6-2-25 所示。
          library(mltools) 
          ddstab <- read.csv("D:/Chapter/Data/diamonds.csv") 
          p1=ggplot(data = ddstab, mapping = aes( 
                     x = 1, y=freq, fill = x ))+ 
                     geom_col() + 
                     coord_polar(theta = "y") + 
                     labs(fill = "Cut")+ 
                     theme_bw()+ 
                     labs(title = "p1") 
         d <- read.csv("D:/Chapter/Data/diamonds.csv") %>%
         mutate( 
                   end_angle = cumpct * 2*pi, # 每块的结束角度
                   start_angle = lag(end_angle, default = 0), # 每块的开始角度
                  mid_angle = 0.5*(start_angle + end_angle), # 每块的中间角度,用于频数数值
                  hjust = ifelse(mid_angle>pi, 1, 0), 
                  vjust = ifelse(mid_angle<pi/2 | mid_angle>3*pi/2, 0, 1)
               ) 
         p <- ggplot(data = d) 
         p2=p + geom_arc_bar(mapping = aes( 
                  x0 = 0, y0 = 0, r0 = 0, r = 1.0, 
                start = start_angle, 
                end = end_angle, 
                fill = x )) + 
                geom_text(aes( 
                       x = 1.1*sin(mid_angle), # 扇形标签位置
                       y = 1.1*cos(mid_angle), 
                      label = x, 
                      hjust = hjust, vjust = vjust), 
                      size =4) + 
               geom_text( 
               aes( 
                     x = 0.6*sin(mid_angle), # 扇形面积值位置
                     y = 0.6*cos(mid_angle), 
                     label = freq 
                      ), 
               color = "white", 
               size =3) + 
        coord_fixed() + 
        scale_x_continuous(expand = c(0.1, 0.4), breaks = NULL, name=NULL) + 
        scale_y_continuous(breaks = NULL, name=NULL) + 
               guides(fill = FALSE)+ # file=Null 显示图例,fill=FALSE 不显示图例
               theme_bw()+ # 背景默认设置为透明
               labs(title = "p2") 
        plot_grid(p1, p2)
                                                                               图 6-2-25 饼图
     (二)环形图
       ggplot2 包允许构建环形图(见图 6-2-26),步骤如下:
       • 输入数据为一个数值变量的组;
       • 绝对数值必须转换成比例;
       • 圆环上的分组是堆叠的一个接一个的显示环;
       • geom_rect()将每一组绘制为一个矩形;
       • coord_polar()用于从堆的矩形切换到环;
       • xlim()在中间添加了一个空圆圈。
        # library(ggplot2) 
        # 创建测试数据
        data <- data.frame( 
               category=c("A", "B", "C"), 
               count=c(10, 60, 30) 
           ) 
         # 计算百分比
        data$fraction = data$count / sum(data$count) 
        # 计算累计百分比
        data$ymax = cumsum(data$fraction) 
        # 计算环形
        data$ymin = c(0, head(data$ymax, n=-1))
        # 绘图
        ggplot(data, aes(ymax=ymax, ymin=ymin, xmax=4, xmin=3, fill=category)) + 
            geom_rect() + 
            coord_polar(theta="y") + # 堆积条形图
            xlim(c(2, 4))+ # 中心添加一个空圆
            theme_bw()
                                                                          图 6-2-26 环形图绘制
       修改相关参数可设置环形图的风格,如图 6-2-27 和图 6-2-28 所示。
       • 使用 theme_void()可去掉不必要的背景、轴、标签等;
       • 使用其他的调色板,不使用图例,并添加标签到环上的组。
       # 计算标签位置上的值
        data$labelPosition <- (data$ymax + data$ymin) / 2 
        # 标签位置
        data$label <- paste0(data$category, "\n value: ", data$count) 
        # 绘图
        ggplot(data, aes(ymax=ymax, ymin=ymin, xmax=4, xmin=3, fill=category)) + 
           geom_rect() + 
           geom_label( x=3.5, aes(y=labelPosition, label=label), size=4) + 
           scale_fill_brewer(palette=9) + 
           coord_polar(theta="y") + 
           xlim(c(2, 4)) + 
           theme_void() + 
           theme(legend.position = "none")
                                                                   图 6-2-27 添加环形标签的环形图
        ggplot(data, aes(ymax=ymax, ymin=ymin, xmax=4, xmin=3, fill=category)) + 
              geom_rect() + 
              geom_text( x=2.5, aes(y=labelPosition, label=label, color="ggsci"), size=4) + 
              # scale_fill_brewer(palette=1) + #设置环形
              # scale_color_brewer(palette=1) + #设置标签
              coord_polar(theta="y") + 
              xlim(c(1.5, 4)) + 
              theme_void() + 
              theme(legend.position = "none")
                                           
                                               图 6-2-28 环形颜色和标签位置重新设置的环形图