Несколько точечных диаграмм на одной фигуре из нескольких фреймов данных в R с использованием ggplot?

Я хочу создать фигуру, которая отображает все диаграммы рассеяния на этой одной фигуре, используя данные из двух фреймов данных (т. Е. Регрессию столбца-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))

Я хочу рисунок, как тот, что ниже

Несколько точечных диаграмм на одной фигуре из нескольких фреймов данных в R с использованием ggplot?

Возможный дубликат Огранка 3 графиков из 3 разных наборов данных с помощью ggplot2

Giovana Stein 30.05.2019 18:12
Не используйте $ внутри своего aes. Свяжите свои фреймы данных вместе и используйте facet_wrap — взгляните на документы по фасетированию
camille 30.05.2019 18:14

Имя столбцов в двух фреймах данных одинаковое, поэтому их объединение может создать проблемы ??

CForClimate 30.05.2019 18:18

@GiovanaStein, это помогает, но не полностью решило мою проблему - я изо всех сил пытаюсь добавить линию тренда вместе с указанием значения p и значения r-квадрата поверх каждого графика.

CForClimate 30.05.2019 18:20

Вы можете связать их по столбцам (cbind или dplyr::bind_cols) с соответствующими именами. Или присоединиться на основе идентификатора

camille 30.05.2019 19:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
7 646
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

sc_plots = list()

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

grid.arrange(sc_plots$sc1, sc_plots$sc2,
 ncol = 3)
Ответ принят как подходящий

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

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

@ Jordo88, @camille, я пытался добавить текст к каждому графику на рисунке, используя grob <- grobTree(textGrob(c(P=0.6, P=0.5,P=0.9), x=0.1, y=0.95, hjust=0, gp=gpar(col = "red", fontsize=13, fontface = "italic"))), а затем annotation_custom(grob). однако для всех графиков используется первое значение (P=0,6).

CForClimate 31.05.2019 00:09

Спасибо @ Jordo82, смотрите результат ниже. Есть ли способ, чтобы текст отображался в верхнем левом углу каждого графика? Ваш код, касающийся добавления текста, хорош, однако он зависит от масштаба, который для однородных данных с одинаковыми числами будет работать, однако, если в данных есть большая изменчивость, такая как в моем реальном случае (см. ось Y фигура) - это может быть не идеальный способ.

CForClimate 31.05.2019 16:15

@Hydrologist, отредактировано, чтобы сделать размещение текста аннотации функцией серии.

Jordo82 31.05.2019 19:28

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

Другие вопросы по теме