我正在尝试绘制生物体所面临的不同蛋白质序列中有趣片段的概述。
每个方面/有机体可能包含不同数量的蛋白质-黑色长段。每种蛋白质都有一个等长的较短部分的彩色覆盖物,这些部分可能会重叠-该颜色表示患者组。
我首先遇到了不同方面的y轴上的蛋白质/片段之间的间距不同的问题。我设法使用指定比例使用ggplot:coord_fixed
函数解决了这个问题。但是,每个小平面中y轴的高度仍然不适合段数。另外,coord_fixed
在尝试facet_wrap(scales = "free_y")
时会引发错误,因为它不允许有自由轴。
如何删除y轴上的多余间距/控制每个小平面内y轴的高度?
以下是一些示例代码:
library(ggplot2)
library(dplyr)
d_list <- lapply(paste("protein", seq(1,100,1)), function(protein){
#The full length the protein
prot_length <- sample(seq(100,500,1), size = 1)
#The organism the protein belongs to
org_name <- sample(paste("organism", seq(1,5,1), sep = "_"), 1)
#The start and end of the segments of interest - 15 amino acids long
start <- sample(seq(1,prot_length-14,1),sample(1:20,1))
end <- start + 14
#The patient/group the segments of interest originate from
group <- sample(paste("patient", seq(1,3,1), sep = "_"), length(start), T)
data.frame(protein_name = rep(protein,length(start)),
protein_length = rep(prot_length, length(start)),
start = start,
end = end,
organism_name = rep(org_name,length(start)),
group = group)
})
d <- do.call("rbind", sample(d_list, 20))
d %>%
arrange(., organism_name, desc(protein_length)) %>%
mutate(., protein_name = factor(protein_name, levels = unique(protein_name))) %>%
ggplot(., aes(x = 1, xend = protein_length, y = protein_name, yend = protein_name)) +
geom_segment(color = rgb(0,0,0), size = 1) +
geom_segment(aes(x = start, xend = end, y = protein_name, yend = protein_name, color = as.factor(group)),
size = 0.7) +
scale_x_continuous(breaks = seq(0,500,100), labels = seq(0,500,100)) +
scale_y_discrete(label = NULL, drop = T) +
scale_color_manual(values = c("firebrick1", "dodgerblue1", "darkgoldenrod1")) +
facet_wrap(~organism_name, ncol = 1, drop = T) +
theme_minimal() +
labs(color = "Group", y = "Proteins", x = "Amino Acid Position") +
theme(axis.title.x = element_text(size = 15, face = "bold", vjust = 0.5),
axis.text.x = element_text(size = 12),
panel.grid.minor.x = element_blank(),
axis.title.y = element_text(size = 15, face = "bold", vjust = 0.5),
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank(),
legend.title = element_text(size = 15, face = "bold"),
legend.text = element_text(size = 12)) +
coord_fixed(ratio = 2)
答案 0 :(得分:1)
编辑以将facet_wrap
的脱模位置与facet_grid
的免费面板尺寸结合起来
(注意:我增加了细分的大小,因为它们确实很难看...)
# data d was created with set.seed(123)
# generate plot without either facet option
p <- d %>%
arrange(organism_name, desc(protein_length)) %>%
mutate(protein_name = factor(protein_name,
levels = unique(protein_name))) %>%
ggplot(aes(x = 1, xend = protein_length,
y = protein_name, yend = protein_name)) +
geom_segment(color = rgb(0, 0, 0), size = 4) +
geom_segment(aes(x = start, xend = end, y = protein_name,
yend = protein_name, color = as.factor(group)),
size = 3) +
scale_x_continuous(breaks = seq(0,500,100), labels = seq(0,500,100)) +
scale_y_discrete(label = NULL, drop = T) +
scale_color_manual(values = c("firebrick1", "dodgerblue1", "darkgoldenrod1")) +
theme_minimal() +
labs(color = "Group", y = "Proteins", x = "Amino Acid Position") +
theme(axis.title.x = element_text(size = 15, face = "bold", vjust = 0.5),
axis.text.x = element_text(size = 12),
panel.grid.minor.x = element_blank(),
axis.title.y = element_text(size = 15, face = "bold", vjust = 0.5),
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank(),
legend.title = element_text(size = 15, face = "bold"),
legend.text = element_text(size = 12))
# create two versions of the plot using facet_grid / facet_wrap,
# with scales set to "free_y" for both, but also space = "free_y" for facet_grid
# (facet_wrap doesn't have this option)
p.grid <- p + facet_grid(organism_name ~ ., scales = "free_y", space = "free_y")
p.wrap <- p + facet_wrap(~ organism_name, ncol = 1, scales = "free_y")
# convert both into grob objects
gp.grid <- ggplotGrob(p.grid)
gp.wrap <- ggplotGrob(p.wrap)
# apply the panel heights of the facet_grid version to the facet_wrap one
gp.wrap$heights[gp.wrap$layout[grep("panel", gp.wrap$layout$name), "t"]] <-
gp.grid$heights[gp.grid$layout[grep("panel", gp.grid$layout$name), "t"]]
# plot the facet_wrap version
grid::grid.draw(gp.wrap)
原始答案
听起来像您在寻找facet_grid
而不是facet_wrap
。如果将scales
和space
都设置为"free_y"
,则可以使轴断裂和刻面高度变化:
d %>%
arrange(organism_name, desc(protein_length)) %>%
mutate(protein_name = factor(protein_name,
levels = unique(protein_name))) %>%
ggplot(aes(x = 1, xend = protein_length,
y = protein_name, yend = protein_name)) +
geom_segment(color = rgb(0, 0, 0), size = 1) +
geom_segment(aes(x = start, xend = end, y = protein_name,
yend = protein_name, color = as.factor(group)),
size = 0.7) +
scale_x_continuous(breaks = seq(0,500,100), labels = seq(0,500,100)) +
scale_y_discrete(label = NULL, drop = T) +
scale_color_manual(values = c("firebrick1", "dodgerblue1", "darkgoldenrod1")) +
facet_grid(organism_name ~ ., drop = T,
scales = "free_y", space = "free_y") +
theme_minimal() +
labs(color = "Group", y = "Proteins", x = "Amino Acid Position") +
theme(axis.title.x = element_text(size = 15, face = "bold", vjust = 0.5),
axis.text.x = element_text(size = 12),
panel.grid.minor.x = element_blank(),
axis.title.y = element_text(size = 15, face = "bold", vjust = 0.5),
panel.grid.major.y = element_blank(),
panel.grid.minor.y = element_blank(),
legend.title = element_text(size = 15, face = "bold"),
legend.text = element_text(size = 12))