Как закрасить фон на диаграмме рассеяния, используя ggplot, но при этом показать точки данных в R? - PullRequest
1 голос
/ 22 апреля 2020

Это мой первый вопрос, поэтому надеюсь, что в этом есть смысл, и спасибо за ваше время заранее из набора данных RNA-Seq. С помощью этого кода я создал график ниже:

   ggplot(control, aes(x=log2_iFGFR1_uninduced, y=log2_iFGFR4_uninduced)) + 
       geom_point(shape = 21, color = "black", fill = "gray70") +
       ggtitle("Uninduced iFGFR1 vs Uninduced iFGFR4 ") +
       xlab("Uninduced iFGFR1") + 
       ylab("Uninduced iFGFR4") +
       scale_y_continuous(breaks = seq(-15,15,by = 1)) +
       scale_x_continuous(breaks = seq(-15,15,by = 1)) +
       geom_abline(intercept = 1, slope = 1, color="blue", size = 1) +
       geom_abline(intercept = 0, slope = 1, colour = "black", size = 1) +
       geom_abline(intercept = -1, slope = 1, colour = "red", size = 1) + 
       theme_classic() + 
       theme(plot.title = element_text(hjust=0.5))

Текущий график рассеяния:

enter image description here

Однако я бы хотел изменить фон графика ниже красной линии до светло-красного и выше синей линии до светло-синего, но все еще в состоянии видеть точки данных в этих регионах. До сих пор я пытался использовать полигоны в коде ниже.

    pol1 <- data.frame(x = c(-14, 15, 15), y = c(-15, -15, 14))
    pol2 <- data.frame(x = c(-15, -15, 14), y = c(-14, 15, 15))

    ggplot(control, aes(x=log2_iFGFR1_uninduced, y=log2_iFGFR4_uninduced)) + 
       geom_point(shape = 21, color = "black", fill = "gray70") +
       ggtitle("Uninduced iFGFR1 vs Uninduced iFGFR4 ") +
       xlab("Uninduced iFGFR1") + 
       ylab("Uninduced iFGFR4") +
       scale_y_continuous(breaks = seq(-15,15,by = 1)) +
       scale_x_continuous(breaks = seq(-15,15,by = 1)) +
       geom_polygon(data = pol1, aes(x = x, y = y), color ="pink1") +
       geom_polygon(data = pol2, aes(x = x, y = y), color ="powderblue") +
       geom_abline(intercept = 1, slope = 1, color="blue", size = 1) +
       geom_abline(intercept = 0, slope = 1, colour = "black", size = 1) +
       geom_abline(intercept = -1, slope = 1, colour = "red", size = 1) + 
       theme_classic() + 
       theme(plot.title = element_text(hjust=0.5))

Новая диаграмма рассеяния:

enter image description here

Однако эти полигоны скрыть мои точки данных в этой области, и я не знаю, как сохранить цвет многоугольника, но также вижу точки данных. Я также попытался добавить «fill = NA» в код geom_polygon, но это делает область белой и сохраняет только цветную рамку. Кроме того, эти многоугольники сдвигают мои границы осей, так как я могу изменить оси, чтобы они начинались в -15 и заканчивались в 15, а не имели лишнюю нежелательную длину? Некоторое время и просил друзей и коллег, которые не смогли помочь.

Спасибо,

Лив

1 Ответ

1 голос
/ 22 апреля 2020

Ваш вопрос состоит из двух частей, поэтому я отвечу на каждую по очереди, используя фиктивный набор данных:

df <- data.frame(x=rnorm(20,5,1), y=rnorm(20,5,1))

Не позволяем geom_polygon скрывать geom_point

Стефан прокомментировал ответ на этот вопрос один. Вот иллюстрация. Порядок операций имеет значение в ggplot. Созданный вами график является результатом каждого geom (рисования), выполняемого последовательно. В вашем случае у вас есть geom_polygon после geom_point, так что это означает, что он построит поверх из geom_point. Чтобы точки были нанесены поверх полигонов, просто выполните geom_point после geom_polygon. Вот иллюстративный пример:

p <- ggplot(df, aes(x,y)) + theme_bw()
p + geom_point() + xlim(0,10) + ylim(0,10)

enter image description here

Теперь, если мы добавим geom_rect после, он скрывает точки:

p + geom_point() +
    geom_rect(ymin=0, ymax=5, xmin=0, xmax=5, fill='lightblue') +
    xlim(0,10) + ylim(0,10)

enter image description here

Чтобы предотвратить это, просто измените порядок geom_point и geom_rect. Это работает для всех geoms.

p + geom_rect(ymin=0, ymax=5, xmin=0, xmax=5, fill='lightblue') +
    geom_point() +
    xlim(0,10) + ylim(0,10)

enter image description here

Удаление пробелов между осью и пределами оси

Вторая часть вашего вопроса спрашивает о том, как убрать пустое пространство между краями вашего geom_polygon и осями. Обратите внимание, как я использовал xlim и ylim для установки ограничений? Это сокращение для scale_x_continuous(limits=...) и scale_y_continuous(limits=...); тем не менее, мы можем использовать аргумент expand= в функциях scale_..., чтобы установить, как далеко «развернуть» график до достижения оси. Вы можете установить параметр расширения для ограничений верхней и нижней осей независимо, поэтому этот аргумент ожидает двухкомпонентный вектор чисел, аналогичный аргументу limits=.

Вот как удалить этот пробел:

p + geom_rect(ymin=0, ymax=5, xmin=0, xmax=5, fill='lightblue') +
geom_point() +
scale_x_continuous(limits=c(0,10), expand=c(0,0)) +
scale_y_continuous(limits=c(0,10), expand=c(0,0))

enter image description here

...