直方图又称柱状图/条形图,用来展示连续数据分布的常用工具,用来估计数据的概率分布。
1.利用hist()函数绘制
使用格式:hist(x,breaks=n,main="name",labels=FASLE,col="blue",border="red",freq=TRUE)
x 向量,直方图的数据;
breaks 描直方图的断点,例如breaks=20表示画出20个柱子;
labels 逻辑变量,TRUE标出频数
main 标题
col 颜色
border外框颜色
freq 逻辑变量,TRUE为数据频数,默认为TRUE;FALSE则为密度
> data(mtcars) #加载数据
> head(mtcars)
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
hist(mtcars$mpg,breaks=20,labels=TRUE,main="mtcars hist",col="blue",border="red")
hist(mtcars$mpg,labels=TRUE,main="mtcars hist",col="blue",border="red",freq=FALSE)
我们可以用lines画出数据的密度曲线
hist(mtcars$mpg,breaks=20,labels=TRUE,main="mtcars hist",col="blue",border="red",freq=FALSE)
lines(density(mtcars$mpg),col="green",lwd=2)
还可以画正态分布的密度曲线
x<-seq(from=min(mtcars$mpg),to=max(mtcars$mpg),by=0.5)
lines(x,dnorm(x,mean(mtcars$mpg),sd(mtcars$mpg)),col="orange",lwd=2)
2.利用ggplot2绘制
1.绘制普通条形图
使用格式 ggplot(data,aes(x=class))+geom_bar()
x 绘制的数据
或者 ggplot(data,aes(y=class))+geom_bar(),则类型分布在y轴
> data(mpg)
> head(mpg)
# A tibble: 6 × 11
manufacturer model displ year cyl trans drv cty hwy fl class
<chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
1 audi a4 1.8 1999 4 auto(l5) f 18 29 p compa…
2 audi a4 1.8 1999 4 manual(m5) f 21 29 p compa…
3 audi a4 2 2008 4 manual(m6) f 20 31 p compa…
4 audi a4 2 2008 4 auto(av) f 21 30 p compa…
5 audi a4 2.8 1999 6 auto(l5) f 16 26 p compa…
6 audi a4 2.8 1999 6 manual(m5) f 18 26 p compa…
g <- ggplot(mpg, aes(x=class)) #直接得出每个class的数目
g+geom_bar()
g <- ggplot(mpg, aes(y=class)) #
g+geom_bar()
当想看在该因素中其他因素的情况,可以利用fill进行绘制,得出叠堆条形图
g <- ggplot(mpg, aes(x=class))
g + geom_bar(aes(fill = drv))
#得出每种class中drv的分布情况
横向的柱状
ggplot(mpg, aes(y = class)) +
geom_bar(aes(fill = drv), position = position_stack(reverse = TRUE)) +
theme(legend.position = "top") #标签位置
2.多组条形图
大多数时候我们想比较多个组直接某些因素的情况,例如有时候我们要画几个样本中各个细胞比例的情况
这是我们可以画堆叠条形图
#设置3个样本
> Sample1<-c(0.1,0.3,0.3,0.2,0.1)
> Sample2<-c(0.1,0.2,0.3,0.3,0.1)
> Sample3<-c(0.3,0.1,0.2,0.3,0.1)
> data<-cbind(Sample1,Sample2,Sample3)
> rownames(data)<-c("CD4_T","CD8_T","Monocyte","B","NK")
> head(data) #大多数时候数据的格式是这样的
Sample1 Sample2 Sample3
CD4_T 0.1 0.1 0.3
CD8_T 0.3 0.2 0.1
Monocyte 0.3 0.3 0.2
B 0.2 0.3 0.3
NK 0.1 0.1 0.1
#首先我们需要转换数据形式
> library(reshape2)
> dat<-melt(data)
> head(dat)
Var1 Var2 value
1 CD4_T Sample1 0.1
2 CD8_T Sample1 0.3
3 Monocyte Sample1 0.3
4 B Sample1 0.2
5 NK Sample1 0.1
6 CD4_T Sample2 0.1
> colnames(dat)<-c("celltype","Sample","proportion")
> head(dat)
celltype Sample proportion
1 CD4_T Sample1 0.1
2 CD8_T Sample1 0.3
3 Monocyte Sample1 0.3
4 B Sample1 0.2
5 NK Sample1 0.1
6 CD4_T Sample2 0.1
dat$proportion<-as.numeric(dat$proportion)
ggplot(dat,aes(x=Sample,y=proportion,fill = celltype))+ #横坐标为样本,纵坐标则为比例
geom_bar(stat= 'identity',position = "stack") #position = "stack"则进行堆叠
#可以调整x和y将条形进行横向比较
ggplot(dat,aes(x=proportion,y=Sample,fill = celltype))+
geom_bar(stat= 'identity',position = "stack")
ggplot(dat,aes(x=Sample,y=proportion,fill = celltype))+
geom_bar(stat='identity',position='dodge') #position='dodge') 则不进行堆叠
此时不好比较,我们可以把同类型细胞放在一块比较,即横坐标变为细胞类型
在实验过程中可以采用容易分析的形式进行比较
ggplot(dat,aes(x=celltype,y=proportion,fill =Sample ))+
geom_bar(stat='identity',position='dodge') #则不进行堆叠
以上是基本绘制的参数,此外还有美化的一些参数
labs 横纵坐标轴的名称
ggttitle 标题名称
geom_bar(width= )设置条形大小,默认情况下,设置为数据分辨率的90%。
theme_bw() 改变背景颜色
scale_fill_manual 自定义颜色
更多参数见R语言绘图——数据可视化ggplot2 介绍和主要的参数
library(RColorBrewer)
cols<-brewer.pal(8,"YlOrRd")[1:5]
names(cols)<-rownames(data)
head(cols)
CD4_T CD8_T Monocyte B NK
"#FFFFCC" "#FFEDA0" "#FED976" "#FEB24C" "#FD8D3C"
ggplot(dat,aes(x=Sample,y=proportion,fill = celltype))+
geom_bar(stat= 'identity',position = "stack",width=0.2) +
labs(x="Sample ID",y="CellType Proportion")+
ggtitle("Sample Celltype Proportion")+
theme_bw()+
scale_fill_manual(values = cols)