ggplot-直方图

1.频数直方图

数据准备

1
2
3
4
5
6
7
8
> head(pacBioData)
V1 V2
1 Ghir_A01G000010 1
2 Ghir_A01G000030 1
3 Ghir_A01G000040 3
4 Ghir_A01G000070 3
5 Ghir_A01G000080 1
6 Ghir_A01G000100 2

如果你同时含有两个样本的频数信息,需要针对不同的样本画不同的的柱子;只需要在数据框中添加一个字段即可。例如我的数据中含有PacBio测序数据和参考基因组数据两个文件

  • PacBio
  • regerence
1
2
3
4
5
6
7
pacBioData<- read.table("PacBio文件")
referenceData <- read.table("reference文件")
##添加分类信息
pacBioData$type <- "PacBio"
referenceData$type <- "reference"
## 合并两个数据框
mergeData <- rbind(pacBioData, referenceData)

绘制直方图

  • x=V2表示x轴数据使用V2字段进行映射
  • fill = type针对type字段使用不同颜色进行填充
  • stat = "count"统计x轴中每个值出现的次数,用作柱子的高度
1
2
3
library(ggplot2)
ggplot(data = mergeData, aes(x = V2, fill = type)) +
geom_bar(stat = "count")

堆积直方图

调整

  • position = "dodge"将柱子调整为不堆积状态
  • width = 0.5调整柱子宽度

这里由于x轴的坐标轴范围比较大,柱子缩放了看不清

1
2
ggplot(data = mergeData, aes(x = V2, fill = type)) +
geom_bar(stat = "count", position = "dodge", width = 0.5)

不堆积

2.频率直方图

数据准备

使用R中的table函数和prop.table函数计算频率

1
2
3
4
5
6
7
PacBioFrequent <- as.data.frame(prop.table(table(pacBioData$V2)))[1:10, ]
referenceFrequent <- as.data.frame(prop.table(table(referenceData$V2)))[1:10, ]
## 样本分类
PacBioFrequent$type <- "PacBio"
referenceFrequent$type <- "reference"
## 合并数据
mergeData <- rbind(PacBioFrequent, referenceFrequent)

处理后的数据

1
2
3
4
5
6
Var1       Freq   type
1 1 0.28121310 PacBio
2 2 0.21962588 PacBio
3 3 0.15747934 PacBio
4 4 0.10686098 PacBio
5 5 0.07342614 PacBio

绘制图形

参数和之前的都是一样的

1
2
ggplot(data = mergeData, aes(x =Var1, y=Freq,fill = type)) +
geom_bar(stat = "identity", position = "dodge", width = 0.5)

频率直方图

3.美化图片

不涉及数据层的美化

  • 图片背景色
  • 图片网格
  • 坐标轴刻度线
  • 坐标轴刻度文字
  • 坐标轴label文字
  • 图例标题
  • 图例位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
p=ggplot(data = mergeData, aes(x =Var1, y=Freq,fill = type)) +
geom_bar(stat = "identity", position = "dodge", width = 0.5)

p+theme_bw() +
theme(
panel.grid = element_blank(), #图片网格线
panel.background = element_blank(), #图片背景色为空
axis.line = element_line(size = 0.5, color = "black"),#坐标轴线条
axis.text.x = element_text(size = "15"), #x坐标轴刻度文字
axis.text.y = element_text(size = "10"), #y坐标轴刻度文字
axis.title.y = element_text(size = "15"), #x坐标轴label文字
legend.title = element_blank(), #图例标题
legend.position = c(0.8, 0.8), #图例位置
)

美化1

自定义填充色

1
2
3
p+  scale_fill_manual(values = c(
"#f6e58d", "#ffbe76", "#686de0", "#4834d4"
))

美化2

调整柱子离坐标轴位置

这里我将柱子与x轴进行贴近,其他的可以类似

  • expand贴近坐标轴的位置
  • limits设置显示的范围
1
p+  scale_y_continuous(expand = c(0, 0), limits = c(0, 1))

美化3

添加自定义文字

通过使用geom_text函数,并且选择不继承原有的图片数据

  • data = labelData要显示的注释信息
  • mapping指定显示的位置和字段
  • inherit.aes是否继承图形数据,如果是使用自定义数据,这里一定要FALSE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#将要展示的注释文字
labelData <- data.frame(text1 = "3.39", text2 = "/", text3 = "2.01")
p+geom_text(
data = labelData,
mapping = aes(x = 8, y = 0.5, label = text1),
inherit.aes = FALSE,
show.legend = NA,
color = "#ffbe76"
) +
geom_text(
data = labelData,
mapping = aes(x = 8.5, y = 0.5, label = text2),
inherit.aes = FALSE,
show.legend = NA,
color = "black"
) +
geom_text(
data = labelData,
mapping = aes(x = 9, y = 0.5, label = text3),
inherit.aes = FALSE,
show.legend = NA,
color = "#4834d4"
)

美化4

参考

  1. CDSN博客
------ 本文结束 thankyou 感谢阅读 ------

欢迎扫一扫上面的微信二维码,订阅 codeHub 公众号