上一期已经分享了R如何绘制多组堆积簇状柱状图,其实上一期的默认的是单纯堆积图,这一期将进一步区别单纯堆积、按比例堆积和分散柱状图如何绘制。
其实ggplot2具体的代码只是区别在于position的选项不一样而已:
position=”stack” 单纯堆积;增加标签时,用position_stack
position=”fill” 按比例堆积;增加标签时,用position_fill
position=”dodge” 分散;增加标签时,用position_dodge
图1数据情况如下:
因此,最后的图是绘制不同性别的高血压、糖尿病的患病率
结果图有三张:大家可以对比一下,下面的代码就会依次实现下面三种情况
.libPaths()
setwd("C:/Users/12974/Desktop/百度经验/01简书/02R语言绘分组簇状柱状图/R绘制单纯堆积 按比例堆积和分散柱状图")#设置工作空间
getwd()#加载工作空间
#加载包
library(ggplot2)
library(tidyr) #pivot_longer()
library(dplyr) #mutate()、case_when()、管道符
library(tibble) #rownames_to_column()
library(ggrepel)#含geom_text_repel,作用不让标签重叠
#导入数据
data1<-read.csv("C:/Users/12974/Desktop/百度经验/01简书/02R语言绘分组簇状柱状图/R绘制单纯堆积 按比例堆积和分散柱状图/data.csv",##这里需要更改工作路径
as.is = TRUE,header = T,sep = ",", fileEncoding='utf-8')
#先看下数据
data1
## 性别 疾病 患病率
## 1 女 高血压 30
## 2 女 糖尿病 30
## 3 男 高血压 60
## 4 男 糖尿病 40
#然后画柱状堆积图,采用geom_bar组件
##x=代表x轴的分组,这里我选 性别
##y=代表数据那一列,这里是 患病率 那一列
##fill= 代表每个图里面的柱状堆积块的分组,
#这里我选 疾病,同时这个后面需要创建图例
p1<-ggplot(data = data1, aes(x=性别, y = 患病率, fill = 疾病)) +
##为不同类别设置颜色
##下面这个是设置柱状堆积块,每一块的颜色,因为前面是用的疾病
##那么就需要定义 "高血压" 和 "糖尿病"的颜色
scale_fill_manual(
values = c("高血压" = "#bd2628",
"糖尿病" = "#caeaf0"))
#单纯堆积,默认
p1+geom_bar(stat="identity", color = "black", size = 0.55, width = 0.7,
position = "stack")+
geom_text(aes(label=患病率),
position=position_stack(vjust=0.5))
可以看到单纯堆积是按照原始数据来的,纵坐标就是原始数据
#按比例堆积
p1+geom_bar(stat="identity", color = "black", size = 0.55, width = 0.7,
position = "fill")+
geom_text(aes(label=患病率),
position=position_fill(vjust=0.5))
可以看到按比例堆积是按照原始数据总和的比例来的,纵坐标一直是0~1。
比如男性的高血压和糖尿病分别是40和60,那么高血压占比40%,即0.4;糖尿病占比60%,即0.6;
男性的高血压和糖尿病分别是30和30,那么高血压和糖尿病均占比50%,即0.5;
#分散柱状图
p1+geom_bar(stat="identity", color = "black", size = 0.55, width = 0.7,
position = "dodge")+
geom_text(aes(label=患病率),
position=position_dodge(width=0.7),vjust=-0.5,hjust=0.5)
可以看到分散堆积也是按照原始数据来的,纵坐标就是原始数据,只是柱子分开了,而不是堆积
今天的分享就到这里,所需要的数据,大家可以自己按照图1写一下,也没有多少。