核型图和 SNP 与 ggplot2 (geom_path, geom_bar, ggbio)
Karyogram and SNP with ggplot2 (geom_path, geom_bar, ggbio)
我想绘制带有 SNP 标记的核型图。
它与函数 segments
一起使用,但我想使用 ggplot2 包来显示优雅的图形。
- ggbio:
我用函数 layout_karyogram
检查了 ggbio 包,但染色体是在垂直位置绘制的。我没有找到一种方法来旋转带有每个染色体下方名称的图形,并在它们的片段旁边写下我的 SNP 名称。
geom_bar
:
然后我尝试了 ggplot2 包中的 geom_bar
:
data<-data.frame(chromosome=paste0("chr", 1:4),size=c(100,400,300,200),stringsAsFactors = FALSE)
dat$chromosome<-factor(dat$chromosome, levels = dat$chromosome)
SNP<-data.frame(chromosome=c(1,1,2,3,3,4),Position=c(50,70,250,20,290,110),Type=c("A","A","A","B","B","B"),labels=c("SNP1","SNP2","SNP3","SNP4","SNP5","SNP6"))
p <- ggplot(data=data, aes(x=chromosome, y=size)) + geom_bar( stat="identity", fill="grey70",width = .5) +theme_bw()
p + geom_segment(data=SNP, aes(x=SNP$chromosome-0.2, xend=SNP$chromosome+0.2, y=SNP$Position,yend=SNP$Position,colour=SNP$Type), size=1) +annotate("text", label =SNP$labels, x =SNP$chromosome-0.5, y = SNP$Position, size = 2, colour= "red")
这里唯一的问题是,它看起来更像是条形图而不是染色体。我想要四肢圆润。 I found someone who got the same problem as I am.
geom_path
:
我没有使用 geom_bar
,而是使用 geom_path
和选项 lineend = "round"
来获得圆形的四肢。
ggplot() + geom_path(data=NULL, mapping=aes(x=c(1,1), y=c(1,100)),size=3, lineend="round")
形状看起来不错。所以我尝试运行几个染色体的代码。
p <- ggplot()
data<-data.frame(chromosome=paste0("chr", 1:4),size=c(100,400,300,200),stringsAsFactors = FALSE)
for (i in 1:length(data[,1])){
p <- p + geom_path(data=NULL, mapping=aes(x=c(i,i), y=c(1,data[i,2])), size=3, lineend="round")
}
它不起作用,我不知道为什么但 p 只保存最后一条染色体而不是在我的核型图中绘制四个染色体。
对这些问题有什么建议吗?
我会选择 geom_segment
。 SNP 片段的 x
start/end 是硬编码的 (as.integer(chr) -+ 0.05
),但除此之外,代码相当简单。
ggplot() +
geom_segment(data = data,
aes(x = chr, xend = chr, y = 0, yend = size),
lineend = "round", color = "lightgrey", size = 5) +
geom_segment(data = SNP,
aes(x = as.integer(chr) - 0.05, xend = as.integer(chr) + 0.05,
y = pos, yend = pos, color = type),
size = 1) +
theme_minimal()
data <- data.frame(chr = paste0("chr", 1:4),
size = c(100, 400, 300, 200))
SNP <- data.frame(chr = paste0("chr", c(1, 1, 2, 3, 3, 4)),
pos = c(50, 70, 250, 20, 290, 110),
type = c("A", "A", "A", "B", "B", "B"))
我想绘制带有 SNP 标记的核型图。
它与函数 segments
一起使用,但我想使用 ggplot2 包来显示优雅的图形。
- ggbio:
我用函数layout_karyogram
检查了 ggbio 包,但染色体是在垂直位置绘制的。我没有找到一种方法来旋转带有每个染色体下方名称的图形,并在它们的片段旁边写下我的 SNP 名称。
geom_bar
:
然后我尝试了 ggplot2 包中的geom_bar
:
data<-data.frame(chromosome=paste0("chr", 1:4),size=c(100,400,300,200),stringsAsFactors = FALSE) dat$chromosome<-factor(dat$chromosome, levels = dat$chromosome) SNP<-data.frame(chromosome=c(1,1,2,3,3,4),Position=c(50,70,250,20,290,110),Type=c("A","A","A","B","B","B"),labels=c("SNP1","SNP2","SNP3","SNP4","SNP5","SNP6")) p <- ggplot(data=data, aes(x=chromosome, y=size)) + geom_bar( stat="identity", fill="grey70",width = .5) +theme_bw() p + geom_segment(data=SNP, aes(x=SNP$chromosome-0.2, xend=SNP$chromosome+0.2, y=SNP$Position,yend=SNP$Position,colour=SNP$Type), size=1) +annotate("text", label =SNP$labels, x =SNP$chromosome-0.5, y = SNP$Position, size = 2, colour= "red")
这里唯一的问题是,它看起来更像是条形图而不是染色体。我想要四肢圆润。 I found someone who got the same problem as I am.
geom_path
:
我没有使用geom_bar
,而是使用geom_path
和选项lineend = "round"
来获得圆形的四肢。
ggplot() + geom_path(data=NULL, mapping=aes(x=c(1,1), y=c(1,100)),size=3, lineend="round")
形状看起来不错。所以我尝试运行几个染色体的代码。
p <- ggplot() data<-data.frame(chromosome=paste0("chr", 1:4),size=c(100,400,300,200),stringsAsFactors = FALSE) for (i in 1:length(data[,1])){ p <- p + geom_path(data=NULL, mapping=aes(x=c(i,i), y=c(1,data[i,2])), size=3, lineend="round") }
它不起作用,我不知道为什么但 p 只保存最后一条染色体而不是在我的核型图中绘制四个染色体。
对这些问题有什么建议吗?
我会选择 geom_segment
。 SNP 片段的 x
start/end 是硬编码的 (as.integer(chr) -+ 0.05
),但除此之外,代码相当简单。
ggplot() +
geom_segment(data = data,
aes(x = chr, xend = chr, y = 0, yend = size),
lineend = "round", color = "lightgrey", size = 5) +
geom_segment(data = SNP,
aes(x = as.integer(chr) - 0.05, xend = as.integer(chr) + 0.05,
y = pos, yend = pos, color = type),
size = 1) +
theme_minimal()
data <- data.frame(chr = paste0("chr", 1:4),
size = c(100, 400, 300, 200))
SNP <- data.frame(chr = paste0("chr", c(1, 1, 2, 3, 3, 4)),
pos = c(50, 70, 250, 20, 290, 110),
type = c("A", "A", "A", "B", "B", "B"))