Построение перекрывающихся позиций в R
У меня есть датафрейм в R, как это:
dat = data.frame(Sample = c(1,1,2,2,3), Start = c(100,300,150,200,160), Stop = c(180,320,190,220,170))
И я хотел бы построить его так, чтобы ось x была позицией, а ось y- количеством образцов в этой позиции, причем каждый образец был другого цвета. Таким образом, в приведенном выше примере у вас будет несколько позиций с высотой 1, некоторые с высотой 2 и одна с высотой 3. Цель состоит в том, чтобы найти регионы, в которых имеется большое количество выборок и какие выборки находятся в этой области.
то есть что-то вроде:
&
---
********- -- **
где * = образец 1, - = образец 2 и & = образец 3
2 ответа
Этот хак может быть тем, что вы ищете, однако я значительно увеличил размер фрейма данных, чтобы использовать преимущества стекирования geom_histogram
,
library(ggplot2)
dat = data.frame(Sample = c(1,1,2,2,3),
Start = c(100,300,150,200,160),
Stop = c(180,320,190,220,170))
# Reformat the data for plotting with geom_histogram.
dat2 = matrix(ncol=2, nrow=0, dimnames=list(NULL, c("Sample", "Position")))
for (i in seq(nrow(dat))) {
Position = seq(dat[i, "Start"], dat[i, "Stop"])
Sample = rep(dat[i, "Sample"], length(Position))
dat2 = rbind(dat2, cbind(Sample, Position))
}
dat2 = as.data.frame(dat2)
dat2$Sample = factor(dat2$Sample)
plot_1 = ggplot(dat2, aes(x=Position, fill=Sample)) +
theme_bw() +
opts(panel.grid.minor=theme_blank(), panel.grid.major=theme_blank()) +
geom_hline(yintercept=seq(0, 20), colour="grey80", size=0.15) +
geom_hline(yintercept=3, linetype=2) +
geom_histogram(binwidth=1) +
ylim(c(0, 20)) +
ylab("Count") +
opts(axis.title.x=theme_text(size=11, vjust=0.5)) +
opts(axis.title.y=theme_text(size=11, angle=90)) +
opts(title="Segment Plot")
png("plot_1.png", height=200, width=650)
print(plot_1)
dev.off()
Обратите внимание, что способ, которым я переформатировал фрейм данных, немного уродлив и не будет хорошо масштабироваться (например, если у вас миллионы сегментов и / или большие стартовые и стоповые позиции).
Моя первая попытка:
dat$Sample = factor(dat$Sample)
ggplot(aes(x = Start, y = Sample, xend = Stop, yend = Sample, color = Sample), data = dat) +
geom_segment(size = 2) +
geom_segment(aes(x = Start, y = 0, xend = Stop, yend = 0), size = 2, alpha = 0.2, color = "black")
Я объединяю две геометрии сегмента здесь. Один рисует цветные вертикальные полосы. Они показывают, где образцы были измерены. Вторая геометрия рисует серую полосу ниже, где показана плотность образцов. Любые комментарии, чтобы улучшить этот быстрый взлом?