Я хочу создать фигуру, которая отображает все диаграммы рассеяния на этой одной фигуре, используя данные из двух фреймов данных (т. Е. Регрессию столбца-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))
Я хочу рисунок, как тот, что ниже
$
внутри своего aes
. Свяжите свои фреймы данных вместе и используйте facet_wrap
— взгляните на документы по фасетированию
Имя столбцов в двух фреймах данных одинаковое, поэтому их объединение может создать проблемы ??
@GiovanaStein, это помогает, но не полностью решило мою проблему - я изо всех сил пытаюсь добавить линию тренда вместе с указанием значения p и значения r-квадрата поверх каждого графика.
Вы можете связать их по столбцам (cbind
или dplyr::bind_cols
) с соответствующими именами. Или присоединиться на основе идентификатора
Вы можете составить список графиков, а затем использовать функцию 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).
Спасибо @ Jordo82, смотрите результат ниже. Есть ли способ, чтобы текст отображался в верхнем левом углу каждого графика? Ваш код, касающийся добавления текста, хорош, однако он зависит от масштаба, который для однородных данных с одинаковыми числами будет работать, однако, если в данных есть большая изменчивость, такая как в моем реальном случае (см. ось Y фигура) - это может быть не идеальный способ.
@Hydrologist, отредактировано, чтобы сделать размещение текста аннотации функцией серии.
@ 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")
Возможный дубликат Огранка 3 графиков из 3 разных наборов данных с помощью ggplot2