Построение перекрывающихся позиций в R - PullRequest
2 голосов
/ 09 декабря 2011

У меня есть датафрейм в 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 ]

2 голосов
/ 09 декабря 2011

Моя первая попытка:

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

enter image description here

Я объединяю две геометрии сегмента здесь.Один рисует цветные вертикальные полосы.Они показывают, где образцы были измерены.Вторая геометрия рисует серую полосу ниже, где показана плотность образцов.Любые комментарии, чтобы улучшить этот быстрый взлом?

1 голос
/ 10 декабря 2011

Этот хак может быть тем, что вы ищете, однако я значительно увеличил размер фрейма данных, чтобы использовать стекирование на 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()

Обратите внимание, что способ, которым я переформатировал фрейм данных, немного уродлив и не будет хорошо масштабироваться (например, если у вас миллионы сегментов и / или большие стартовые и стоповые позиции).

enter image description here

...