step1:导入库
library(ggplot2)
library(ggpol)
library(dplyr)
step2:读取数据
data <- readxl::read_xlsx("data_new.xlsx", sheet = 1)
data
- readxl::read_xlsx() 是 readxl 包中的函数,用于读取Excel文件。
step3:数据转换
mydata <- data %>% select(1, 3, 4) %>% reshape2::melt(id.vars = "Group", variable.name = "Sex", value.name = "Prop")
mydata <- data %>% select(1, 3, 4)
:select(1, 3, 4) 选择数据框 data 中的第1列、第3列和第4列。%>% reshape2::melt(id.vars = "Group", variable.name = "Sex", value.name = "Prop")
reshape2::melt()
函数用于将数据框从宽格式(wide format)转换为长格式(long format),这样更容易进行分析和可视化id.vars = "Group"
指定 “Group” 列作为标识变量,即不进行融化的列。variable.name = "Sex"
指定新生成的列的名称,该列包含了之前选择的列的列名(在这里是 “Sex”)。
step4:对称显示,取一半设置为负
mydata$Prop <- ifelse(mydata$Sex == "Male", mydata$Prop * -1, mydata$Prop)
-
ifelse(mydata$Sex == "Male", mydata$Prop * -1, mydata$Prop)
:
-
mydata$Sex == "Male"
是一个条件表达式,检查 “Sex” 列是否等于 “Male”。
如果条件为真,即 “Sex” 列的值是 “Male”,则执行 mydata$Prop * -1,将 “Prop” 列的值乘以 -1。如果条件为假,即 “Sex” 列的值不是 “Male”,则保持 “Prop” 列的值不变。
ifelse() 函数将根据条件逐元素地应用这个逻辑,生成一个新的列。
step5: 标签文本
mydata$label <- abs(mydata$Prop) %>% round(digits = 2)
head(mydata)
- 在数据框 mydata 中添加一个名为 “label” 的新列,该列包含 “Prop” 列的绝对值,并将结果取两位小数
step6: 绘图
plot <- ggplot(mydata, aes(Prop, Group, fill = Sex)) + geom_col(width = 0.6, color = "black") + geom_text(aes(label = label), size = 4) + facet_share(~Sex, scales = "free_x", reverse_num = TRUE) + labs(x = "Prop(%)", caption = "Source:福建省统计年鉴(2022)") + scale_fill_brewer(palette = "Set1" ) + theme_bw(base_size = 15) + theme(axis.title.y = element_blank(),plot.title = element_text(hjust = 0.5),axis.text = element_text(colour = "black"))