二、描述变量比例的可视化图形

(一)饼图绘制 饼图,是将总体看作一个圆,按照各分类的占比情况将圆划分成大小不同的扇形,以弧度的大小来表示某一分类的占比。饼图可以快速了解各分类的情况,但一般分类的数量不能太多,否则会导致圆被切割为很多块,不利于展示在饼图中,另外通常会将占比最大的分类放置在最显眼的地方,即 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 环形颜色和标签位置重新设置的环形图