在 R (geom_rect) 中使用 ggplot2 来可视化沿着不同长度的堆叠条的多个位置

using ggplot2 in R (geom_rect) to visualise multiple positions along stacked bars of different lengths

假设我有 4 个不同大小的样本,并且在每个样本中我有从 m 到 n 的顺序位置。

我想用彩色条可视化每个样本的长度,并放置指示样本内位置的线条,如下所示:

这是我目前所拥有的,但是我不希望将位置存储在单独的数据框中。

library("ggplot2") 

# data for coloured bars (samples)
dat=data.frame(x1=c(1,1,1,1), x2=c(200,100,270,500), y1=c(1.1,1.3,1.5,1.7), y2=c(1.2,1.4,1.6,1.8), samp=c('1','2','3','4'))

# data for each position within each sample 
pos1=data.frame(x1=c(100,50,24,100), x2=c(101,51,25,101), y1=c(1.1,1.3,1.5,1.7), y2=c(1.2,1.4,1.6,1.8), samp=c('1','2','3','4'))
pos2=data.frame(x1=c(110,65,120,405), x2=c(111,66,121,406), y1=c(1.1,1.3,1.5,1.7), y2=c(1.2,1.4,1.6,1.8), samp=c('1','2','3','4'))
pos3=data.frame(x1=c(190,70,240,442), x2=c(191,71,241,443), y1=c(1.1,1.3,1.5,1.7), y2=c(1.2,1.4,1.6,1.8), samp=c('1','2','3','4'))

# plot each sample above the next 
ggplot() + 
  scale_x_continuous(name="x") + 
  scale_y_continuous(name="y") +
  geom_rect(data=dat, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2, fill=samp), color="black", alpha=0.5) +
  geom_text(data=dat, aes(x=x1, y=y1, label=samp), size=4) +
  geom_rect(data=pos1, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2), color="black", alpha=0.5) +
  geom_rect(data=pos2, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2), color="black", alpha=0.5) +
  geom_rect(data=pos3, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=y2), color="black", alpha=0.5) 

任何人都可以帮助我将 pos1、pos2 和 pos3 组合成一个数据框来绘制它吗?我也愿意接受有关更好的方法的建议!

这是一个非常简化的数据版本。我总共有大约 20 个样本,每个样本有数百个位置。

如有任何帮助,我们将不胜感激!

干杯:)

编辑#1:

我的原始数据是这样的:

positions=data.frame(sample=c(1,1,1,2,2,2,3,3,3,4,4,4),position=c(100,110,190,50,65,70,24,120,240,100,405,442))

samples=data.frame(sample=c(1,2,3,4), length=c(200,100,270,500))

更新:

我又看了一遍资料,我觉得这个比较符合你的要求:

dat2 <- dat %>% 
  mutate(x2 = 0, obs = 0) %>% 
  bind_rows(pos1 %>% mutate(obs = 1)) %>% 
  bind_rows(pos2 %>% mutate(obs = 2)) %>% 
  bind_rows(pos3 %>% mutate(obs = 3)) %>% 
  bind_rows(dat %>% mutate(obs = 4)) %>% 
  group_by(samp) %>% 
  mutate(x = x2 - lag(x2))

ggplot(dat2, aes(x=samp)) +
  geom_col(aes(y=x, fill=obs), color="black", alpha=0.5) +
  coord_flip() +
  scale_fill_gradient(low="steelblue", high="steelblue") +
  theme(legend.position = "none")

原答案:

我不确定我是否正确读取了您的数据,但这是一次尝试:

dat2 <- dat %>% 
  mutate(obs = 0) %>% 
  bind_rows(pos1 %>% mutate(obs = 1)) %>% 
  bind_rows(pos2 %>% mutate(obs = 2)) %>% 
  bind_rows(pos3 %>% mutate(obs = 3))

ggplot(dat2, aes(x=samp)) +
  geom_col(aes(y=x2, fill=obs), color="black", alpha=0.5) +
  coord_flip() +
  scale_fill_gradient(low="steelblue", high="steelblue") +
  theme(legend.position = "none")