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