Несколько графиков рассеяния на одном рисунке из нескольких фреймов данных в R, используя ggplot? - PullRequest
1 голос
/ 30 мая 2019

Я хочу сгенерировать фигуру, которая отображает все диаграммы рассеяния на этой единственной фигуре, используя данные из двух фреймов данных (т. Е. Регрессия столбца A данных1 в столбец A данных2).Каждый график на рисунке должен показывать R-квадрат и p-значение.Мне больше интересно узнать, как я могу использовать функцию fact_wrap для ggplot при получении данных из нескольких фреймов данных.Я попробовал пару методов, но безуспешно.

library(tidyverse)
Data1=data.frame(A=runif(20, min = 0, max = 100), B=runif(20, min = 0, max = 250), C=runif(20, min = 0, max = 300))
Data2=data.frame(A=runif(20, min = -10, max = 50), B=runif(20, min = -5, max = 150), C=runif(20, min = 5, max = 200))

#method-1: using plot functions
par(mfrow=c(3,1))
plot(Data1$A, Data2$A)
abline(lm(Data1$A ~ Data2$A))
plot(Data1$B, Data2$B)
abline(lm(Data1$B ~ Data2$B))
plot(Data1$C, Data2$C)
abline(lm(Data1$C ~ Data2$C))
dev.off()

#method-2: using ggplot
ggplot()+
  geom_point(aes(Data1$A,Data2$A))

Мне нужна фигура, подобная приведенной ниже

enter image description here

Ответы [ 3 ]

0 голосов
/ 30 мая 2019

Самое сложное - привести в порядок ваши данные.Как только это сделано, сюжет довольно прост.

    library(tidyverse)
Data1=data.frame(A=runif(20, min = 0, max = 100), B=runif(20, min = 0, max = 250), C=runif(20, min = 0, max = 300))
Data2=data.frame(A=runif(20, min = -10, max = 50), B=runif(20, min = -5, max = 150), C=runif(20, min = 5, max = 200))


data <- Data1 %>% 
  #add columns to indicate the source and the observation number
  mutate(source = "Data1",
         obs = row_number()) %>% 
  #bind to Data2 with the same new columns
  bind_rows(Data2 %>% mutate(source = "Data2", obs = row_number())) %>% 
  #tidy the data so we've got a column for Data1 and Data2 and an indicator for the series (A, B, C)
  gather(A, B, C, key = series, value = value) %>% 
  spread(key = source, value = value)

#create a separate data frame for annotations, finding the "top left" corner of each series
annotations <- data %>% 
  group_by(series) %>% 
  summarise(x = min(Data1),
            y = max(Data2)) %>% 
  mutate(label = c("P = 0.6", "P = 0.5", "P = 0.9"))

#plot the data, faceting by series
data %>% 
  ggplot(aes(Data1, Data2))+
  geom_point() + 
  geom_smooth(method = "lm", se = FALSE) + 
  facet_grid(series~., scales = "free") +
  #add the annotations with adjustments to the horiz & vert placement
  geom_text(data = annotations, aes(x = x, y = y, label = label, hjust = 0, vjust = 1), 
           color = "red", fontface = "italic")

enter image description here

0 голосов
/ 31 мая 2019

@ Jordo82, вот что я получаю, когда пытаюсь вставить текст на рисунках. Есть ли способ освободить ось Y таким образом, чтобы добавленный текст не зависел от шкалы y, а отображается в верхнем левом углу каждого графика. Причина, по которой я использовал annotate_custom, заключалась в том, что она не зависит от шкалы y, но недостатком является то, что я бы взял только первый текст в метках. мои реальные значения настолько отличаются друг от друга - см. шкалу Y на прилагаемом рисунке.

Я использовал ваш код при редактировании координаты размещения

 annotate("text", -1.5, 800, label = c("P = 0.6", "P = 0.5", "P = 0.9", "P = 0.9"), 
             color = "red", fontface = "italic")

enter image description here

0 голосов
/ 30 мая 2019

Вы можете составить список графиков, а затем использовать функцию grid.arrange ().

sc_plots = list()

sc_plots$sc1 = ggplot() + ...
sc_plots$sc2 = ggplot() + ...

grid.arrange(sc_plots$sc1, sc_plots$sc2,
 ncol = 3)
...