ggplot2应用(一)——柱形图
前言
柱形图属于类别比较型图表,包括单数据系列柱状图、多数据系列柱状图、堆积柱状图和百分比堆积柱形图。柱形图一般适用于离散型变量的刻画。
使用函数:geom_bar()
-
单数据系列柱状图
数据背景:
#加载包
library(ggplot2)
#生成数据框
Cut <- c('Fair','Good','Very Good','Premium','Ideal')
Price <- c(4300,3800,3950,4700,3500)
mydata <- data.frame(Cut,Price)
#查看数据框
head(mydata)
直接绘制单数据柱状图:
ggplot(data = mydata,aes(Cut,Price))+
geom_bar(stat = 'identity',#不做任何统计变换
width = 0.5,#设置每个柱的宽度
color = 'black',#设置柱的边框色
size = 0.5,#设置柱的边框尺寸
fill = 'red',#设置柱的填充色
alpha = 1#设置柱填充色的透明度
)+
theme_classic()#设置图标主题
成图:
Rplot01.jpeg
如果我们想将图按照柱高降序来进行绘制,就需要对数据框进行排序,ggplot2默认横轴的类别型数据类型按照首字母顺序进行排列,这就需要我们在向量排序方面的知识:
#首先对Price进行降序排序,并返回index
order <- sort(mydata$Price,index.return = T,decreasing = T)
#查看order
order
$x
[1] 4700 4300 3950 3800 3500
$ix
[1] 4 1 3 2 5
#对Cut进行排序,并转换为因子,固定顺序
mydata$Cut <- factor(mydata$Cut,levels = mydata$Cut[order$ix])
再进行绘制:
Rplot02.jpeg
-
多数据系列柱状图
数据背景(某模型小鼠在给药前后某指标的变化):
mydata <- read.table(file = 'test.txt',sep = '\t',header = T)
#查看数据
mydata
Catergory Before_drug After_drug
1 Group1 32.4 25.0
2 Group2 27.3 22.1
3 Group3 26.7 22.3
4 Group4 28.7 21.6
在进行多数据系列柱状图的绘制时,我们需要将多维的数据框转换成为二维的数据框,reshape2包中的melt函数可以实现这个功能。
library(reshape2)
mydata <- melt(mydata,id.vars = 'Catergory')
#查看mydata
Catergory variable value
1 Group1 Before_drug 32.4
2 Group2 Before_drug 27.3
3 Group3 Before_drug 26.7
4 Group4 Before_drug 28.7
5 Group1 After_drug 25.0
6 Group2 After_drug 22.1
7 Group3 After_drug 22.3
8 Group4 After_drug 21.6
ggplot(mydata,aes(Catergory,value))+
geom_bar(aes(fill = variable),#对bar按照variable进行填充
stat = 'identity',color = 'black',
position = position_dodge(width = 0.6),#水平放置,两个bar左边界距离为0.6
width = 0.5,size = 0.5)+
theme_classic()
成图:
Rplot03.jpeg
-
堆积柱状图
数据背景:(实例数据为5个病人的组织样品中某几种细胞的数量)
mydata <- read.table(file = 'test.txt',header = T)
Group Sample1 Sample2 Sample3 Sample4 Sample5
1 B_cell 981 1021 688 534 1156
2 T_cell 652 678 587 205 986
3 Epithelial_cell 106 187 201 186 194
4 RBC 25 29 85 65 97
首先还是将多维数据转换为二维数据:
mydata <- melt(mydata,id.vars = 'Group')
然后进行图形的绘制:
geom_bar(aes(fill = Group),#对bar按照Group进行填充
stat = 'identity',#在绘制堆积柱状图时必须指定此参数,否则会出现自动统计变换(求和)的情况,报错
position = 'stack',#绘制堆积柱状图的参数
color = 'black',width = 0.5,size = 0.5)+
scale_fill_manual(values = c('#FF9641','#FF5B4E','#B887C3','#38C25D'))+
#这个参数对Group映射到bar的颜色进行了精修,对每种细胞的bar的fill颜色进行了自定义
theme_classic()
成图:
在这个图的绘制过程中需要说明的是:
(1)stat = 'identity',这个参数在绘制堆积柱状图的时候必须声明,否则会自动进行统计变换,出现报错。
(2)scale_fill_manual()这个参数针对类别型变量,且颜色的指定需使用values参数指定。
当然,你可能还是觉得这个图怪怪的,主要是因为你想按照从大到小进行堆叠,实际上这就又是对数据框进行重新编排,过程如下:
mydata$Group <- factor(mydata$Group,levels = c('RBC','Epithelial_cell','T_cell','B_cell'))
#下面的命令一样:
ggplot(mydata,aes(variable,value))+
geom_bar(aes(fill = Group),
stat = 'identity',
position = 'stack',
color = 'black',width = 0.5,size = 0.5)+
scale_fill_manual(values = c('#FF9641','#FF5B4E','#B887C3','#38C25D'))+
theme_classic()
成图:
Rplot4.jpeg
在这里,需要对这个排序的问题进行说明一下:
在R里面,可以将数据类型分为类别型、序数型、数值型,像本例当中不同的细胞类型就属于类别型变量,这种变量是没有顺序的,所以ggplot2绘图时会根据字母顺序进行排列。而我们想自己定义顺序的话,就需要将其转变成为序数型变量,恰好因子型变量就是我们所需要的,所以我们在这里通过factor()将一个类别型的字符串向量转变成了序数型的变量。
-
百分比堆积柱状图
为了更好地刻画不同变量之间的比例信息,我们可以绘制百分比堆积柱状图。(本例种同样使用上面的数据)
#查看数据
mydata
Group Sample1 Sample2 Sample3 Sample4 Sample5
1 B_cell 981 1021 688 534 1156
2 T_cell 652 678 587 205 986
3 Epithelial_cell 106 187 201 186 194
4 RBC 25 29 85 65 97
#小tips:计算每个Sample中RBC细胞的占比
Percentage <- (as.matrix(mydata[4,2:ncol(mydata)]))/t(as.matrix(colSums(mydata[,2:ncol(mydata)])))
上面给大家介绍了一个计算每个Sample中RBC细胞占比的方法,里面用到了一个colSums()函数,表示对列进行求和,大家可以尝试理解一下。
下面展示进行百分比堆积柱状图的绘制,注意,这个图的绘制不需要我们自己求比例,上面仅仅为了展示,命令如下:
library(reshape2)
mydata <- melt(mydata,id.vars = 'Group')
mydata$Group <- factor(mydata$Group,levels = c('RBC','Epithelial_cell','T_cell','B_cell'))
ggplot(mydata,aes(variable,value))+
geom_bar(aes(fill = Group),
stat = 'identity',
position = 'fill',
color = 'black',width = 0.5,size = 0.5)+
scale_fill_manual(values = c('#FF9641','#FF5B4E','#B887C3','#38C25D'))+
theme_classic()
成图:
请大家注意,我们在绘制堆积柱状图时,需要展示在X轴的变量是作为列名存在的,如果拿到的数据不是这样的排布,可以首先使用t()对数据框进行转置操作,得到我们想要的形式。
今天又是摸鱼的一天!