R 将离散y轴高度调整为面中的分段数

R 将离散y轴高度调整为面中的分段数,r,ggplot2,facet-wrap,R,Ggplot2,Facet Wrap,我试图对生物体不同蛋白质序列中的有趣片段进行概述 每个小面/生物体可能包含不同数量的蛋白质-黑色长片段。每种蛋白质都有一个相同长度的较短片段的彩色覆盖层,这些片段可能重叠-颜色表示患者组 我首先遇到的问题是y轴上不同面上蛋白质/片段之间的间距不同。我设法用ggplot解决了这个问题:coord\u fixed函数使用指定的比率。但是,每个面中y轴的高度仍然不适合分段的数量。此外,coord\u fixed在尝试facet\u wrap(scales=“free\u y”)时抛出错误,因为它不允许

我试图对生物体不同蛋白质序列中的有趣片段进行概述

每个小面/生物体可能包含不同数量的蛋白质-黑色长片段。每种蛋白质都有一个相同长度的较短片段的彩色覆盖层,这些片段可能重叠-颜色表示患者组

我首先遇到的问题是y轴上不同面上蛋白质/片段之间的间距不同。我设法用ggplot解决了这个问题:
coord\u fixed
函数使用指定的比率。但是,每个面中y轴的高度仍然不适合分段的数量。此外,
coord\u fixed
在尝试
facet\u wrap(scales=“free\u 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)
库(ggplot2)
图书馆(dplyr)

d_列表编辑以将
镶嵌面包裹
的条带位置与
镶嵌面网格
的自由面板尺寸相结合

(注意:我增加了片段大小,因为它们很难看到…)


为什么
org\u名称示例中出现错误-我现在已经编辑了示例。谢谢你指出@KonradRudolph。谢谢你Z.Lin,它确实解决了间距问题。现在是美学问题。如何将镶嵌面标签移动到镶嵌面顶部?-如
facet\u wrap
@embacify所示,我认为这只能通过
facet\u wrap
实现。如果您对grobs感到满意,那么就有可能破解一些能够获得两个方面选项所需部分的东西。我会更新我的解决方案。太好了!这正是我想要的。使用grobs是我仍在努力适应的事情。这个答案肯定有助于我的学习。
# 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)
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))