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" ))