[英]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 組合成一個數據幀的 plot 這個? 我也願意接受有關更好方法的建議!
這是一個非常簡化的數據版本。 我總共有大約 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")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.