使用 geom_tile 和高度改变瓷砖之间的间距?

use*_*672 5 r ggplot2

使用 geom_tile,我想在每行数据之间放置一条水平线。看起来如果我在美学上使用颜色,它会在水平和垂直方向上都有线条,这不是我想要的。过去,我只是将图块的高度变小,以便它们之间有一些分离。但是,似乎每行的空间量都不同?为什么会这样,有没有办法让分离始终一样?

在此输入图像描述

library(ggplot2)
gn <- c(rep("gn1", 5),  rep("gn2", 5),  rep("gn3", 5),  rep("gn4", 5),  rep("gn5", 5), 
    rep("gn6", 5),  rep("gn7", 5),  rep("gn8", 5),  rep("gn9", 5),  rep("gn10", 5),
    rep("gn11", 5), rep("gn12", 5), rep("gn13", 5), rep("gn14", 5), rep("gn15", 5),
    rep("gn16", 5), rep("gn17", 5), rep("gn18", 5), rep("gn19", 5))

smpl <- rep(c("smpl1", "smpl2", "smpl3", "smpl4", "smpl5"), 19)

mut1 <- c(0, 2, 3, 3, 0)
mut2 <- c(0, 2, 2, 0, 3)
mut3 <- c(2, 0, 2, 0, 3)
mut4 <- c(0, 0, 2, 2, 3)
mut5 <- c(0, 2, 3, 3, 2)

mut <- c(mut1, mut2, mut3, mut4, mut5, mut2, mut3, mut1, mut4, mut2,
     mut5, mut1, mut4, mut5, mut5, mut1, mut3, mut1, mut4)

mut <- factor(mut, levels=c(0,2,3))

tst <- data.frame(gn=gn, smpl=smpl, mut=mut)

ggplot(tst, aes(x=smpl, y=gn, fill=mut, height=0.95)) + 
    geom_tile() +
    guides(fill=F) +
    ylab("Genes") +
    xlab("Sample") +
    scale_fill_manual(values=c("#FFFFFF", "#00BFC4", "#F8766D")) +
    theme(panel.grid.major.y=element_blank()) +
    theme(panel.grid.major.x=element_blank()) +
    theme(panel.grid.minor.y=element_blank()) +
    theme(panel.grid.minor.x=element_blank()) +
    theme(panel.background=element_rect(fill="#000000")) +
    theme(axis.ticks.x=element_blank(),
          axis.text.x=element_blank(),
          axis.title.x=element_blank())
Run Code Online (Sandbox Code Playgroud)

Jul*_*ora 2

n1 <- length(unique(tst$gn))
n2 <- length(unique(tst$smpl))
Run Code Online (Sandbox Code Playgroud)

分别是 y 轴和 x 轴的部分数。然后我们可以利用geom_line它来实现结果:

ggplot(tst) + 
  geom_tile(aes(x = smpl, y = gn, fill = mut)) + # aes for geom_tile
  guides(fill = FALSE) + ylab("Genes") + xlab("Sample") +
  scale_fill_manual(values = c("#FFFFFF", "#00BFC4", "#F8766D")) +
  theme(panel.grid.major.y = element_blank()) +
  theme(panel.grid.major.x = element_blank()) +
  theme(panel.grid.minor.y = element_blank()) +
  theme(panel.grid.minor.x = element_blank()) +
  theme(panel.background = element_rect(fill = "#000000")) +
  theme(axis.ticks.x = element_blank(),
        axis.text.x = element_blank(),
        axis.title.x = element_blank()) +
  geom_line(data = data.frame(x = c(0, n2) + 0.5, y = rep(2:n1, each = 2) - 0.5),
            aes(x = x, y = y, group = y)) # Horizonal lines
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述