Добавьте прямоугольник на фоне гистограмм с помощью ggplot2 - PullRequest
1 голос
/ 09 июля 2020

Я хотел бы раскрасить фон, добавив прямоугольники в гистограммы, полученные с помощью ggplot2. К сожалению, мои гистограммы не построены, и я не понимаю почему. введите описание изображения здесь

Вот мой код, спасибо за помощь:

##### DATA FOR HISTROGRAM
chr = 1:11
nb_SNP = 1000
SNP_positions <- data.frame()
for(c in chr){
  for(n in 1:nb_SNP){
    position <- sample(1:5000000, 1)
    SNP_positions <- rbind(SNP_positions,data.frame(chr = chr, position = position))
  }
}

##### DATA FOR RECTANGLE
df_chr <- data.frame(chr=c(1:11), 
                     xmin = rep(1,11),
                     xmax = c(40297282, 64237462, 80088348, 41978404, 74731017, 53893726, 52447651, 74330457, 39019482, 39359118, 45510589))

#### MAKE PLOT
MarkerDensity <- ggplot(SNP_positions) + 
  geom_rect(data = df_chr, aes(xmin = xmin, xmax = xmax, fill = as.factor(chr)),ymin = -Inf, ymax = Inf, alpha = 0.5) +
  geom_histogram(aes(x=position), binwidth=1000) +
  facet_wrap(~chr,ncol=3) + ggtitle("SNP density over E. grandis genome") +
  xlab("Genomic position (1 Kb)") +
  ylab("Number of SNPs") +
  theme_bw()
plot(MarkerDensity)

Ответы [ 2 ]

6 голосов
/ 09 июля 2020

Так как позиции x вашего прямоугольника оттенка не совпадают с положениями x гистограммы.

Вот упрощенный пример, который работает, используя ваши данные SNP (только для 2 хромосом для простоты), но новые данные прямоугольника, где позиции совпадение с данными SNP:

##### DATA FOR RECTANGLE
df_chr <- data.frame(chr = 1:2, 
                     xmin = rep(1,2),
                     xmax = c(1000, 2000),
                     ymin = -Inf,
                     ymax = Inf)

#### MAKE PLOT
ggplot(SNP_positions[ SNP_positions$chr %in% 1:2, ]) + 
  geom_rect(data = df_chr, aes(xmin = xmin, xmax = xmax, fill = as.factor(chr)),
            ymin = -Inf, ymax = Inf, alpha = 0.5) +
  geom_histogram(aes(x=position), binwidth=1000) +
  facet_wrap(~chr,ncol=2) +
  ggtitle("SNP density over E. grandis genome") +
  xlab("Genomic position (1 Kb)") +
  ylab("Number of SNPs") +
  theme_bw()

введите описание изображения здесь

2 голосов
/ 09 июля 2020

Аргумент xmax для geom_rect может быть вычислен на основе данных с помощью aggregate. Тогда гистограммы будут соответствовать ширине прямоугольников.

xmax <- aggregate(position ~ chr, SNP_positions, max)[[2]]
##### DATA FOR RECTANGLE
df_chr <- data.frame(chr = 1:10,
                     xmin = rep(1, 10),
                     xmax = xmax,
                     ymin = 0,
                     ymax = 100000000)

#### MAKE PLOT
MarkerDensity <- ggplot(SNP_positions,aes(x=position)) +
  geom_rect(data = df_chr, aes(xmin = xmin, xmax = xmax, fill = as.factor(chr)),ymin = -Inf, ymax = Inf, alpha = 0.5) +
  geom_histogram(binwidth = 50) +
  facet_wrap(~chr,ncol=3) + ggtitle("SNP density over E. grandis genome") +
  xlab("Genomic position (1 Kb)") +
  ylab("Number of SNPs") +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 60, hjust=1))

MarkerDensity

введите описание изображения здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...