使用ggplot2画Admixture群体结构图

关于怎么使用Admixture做群体结构分析可以参考这个篇文章。大多数其它介绍的绘图的都是用barplot画图,这样得到的图很多地方不好调整,这里主要讲怎么使用ggplot2画分群的结果图。

  1. 对群体进行聚类,将相近的个体放在一起,这里主要用到dist函数和hclust函数。
  2. 将个体的名称按照聚类的顺序排列
  3. 将个体的分群信息也按聚类的顺序排列
  4. 重新组合成一个新的数据框
  5. 使用reshap2的melt将数据框的宽数据转换成长数据
  6. 使用ggplot2绘图
library(ggplot2)
library(reshape2)

####cluster#######
df_order <- read.table("admixture/snp.4.Q", header = F, sep = " ")
out.dist=dist(df_order, method="euclidean")
out.hclust=hclust(out.dist,method="ward.D")
order_s <- out.hclust$order

df_sample <- read.table("admixture/snp.nosex", header = F, sep = "\t") ##存放个体名称的文件

df_sample  <- df_sample [,1]

df_sample <- df_sample[order_s]

col_panel <- rainbow(4)  ###设置调色板
#########i=4
i <- 4
file <- paste("admixture/snp.", i, ".Q", sep = "")
df <- read.table(file, header = F, sep = " ")
df <- df[order_s,]

df_new <- transform.data.frame(samples=df_sample, df)  ###组合成新的数据框

aql <- melt(df_new, id.vars = "samples")
aql$samples <- factor(x=aql$samples, levels = df_sample)
y_lab <- paste("K=", i, sep = "")

p4 <- ggplot(aql) + geom_bar(aes(x=samples, weight=value, fill=variable), position = "stack", width = 1) +
  scale_x_discrete(expand = c(0,0)) + scale_y_discrete(expand = c(0,0)) + 
  scale_fill_manual(values = col_panel ) + ####可根据需要调整颜色
  theme(legend.position = "none",
        panel.background = element_blank(),
        axis.text.x = element_text(angle = 90, size = 10),
        axis.title.x = element_blank(),
        axis.ticks = element_blank(), axis.title.y = element_text(size = 13),
        panel.grid = element_blank()) + ylab(y_lab)