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