在R(geom_rect)中使用ggplot2沿不同长度的堆叠条形显示多个位置

想象一下,我有4个不同大小的样本,并且在每个样本中,我有从m到n的连续位置。

我想用彩色条显示每个样品的长度,并放置指示样品位置的线,如下所示:

在R(geom_rect)中使用ggplot2沿不同长度的堆叠条形显示多个位置

这是我到目前为止的内容,但是我不希望将职位存储在单独的数据框中。

library("ggplot2") 

# data for coloured bars (samples)
dat=data.frame(x1=c(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),'4'))
pos2=data.frame(x1=c(110,65,120,405),x2=c(111,66,121,406),'4'))
pos3=data.frame(x1=c(190,70,240,442),x2=c(191,71,241,443),'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,ymax=y2),alpha=0.5) +
  geom_rect(data=pos2,alpha=0.5) +
  geom_rect(data=pos3,alpha=0.5) 

有人可以帮助我将pos1,pos2和pos3组合成一个数据框吗?我也欢迎提出更好的方法的建议!

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

任何帮助将不胜感激!

干杯:)

编辑#1:

我的原始数据如下:

positions=data.frame(sample=c(1,2,3,4,4),position=c(100,110,190,405,442))

samples=data.frame(sample=c(1,length=c(200,500))
chensong651 回答:在R(geom_rect)中使用ggplot2沿不同长度的堆叠条形显示多个位置

更新

我再次查看了数据,我认为这更符合您的要求:

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")

enter image description here

原始答案:

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

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,high="steelblue") +
  theme(legend.position = "none")

enter image description here

本文链接:https://www.f2er.com/3079372.html

大家都在问