Вопрос или проблема
У меня есть такие данные в R:
library(ggplot2)
library(dplyr)
set.seed(123)
data <- data.frame(
height = rnorm(1000, mean = 170, sd = 10),
weight = rnorm(1000, mean = 70, sd = 15),
country = sample(c("США", "Канада", "Великобритания", "Австралия"), 1000, replace = TRUE)
)
Я использую этот код, чтобы сделать фасет высоты против веса для каждой страны:
library(ggplot2)
library(gridExtra)
# Создаем отдельные графики для каждой страны
p1 <- ggplot(data %>% filter(country == "США"), aes(x = height, y = weight)) +
geom_point(alpha = 0.5) +
labs(title = "США", x = "Рост (см)", y = "Вес (кг)") +
theme_minimal()
p2 <- ggplot(data %>% filter(country == "Канада"), aes(x = height, y = weight)) +
geom_point(alpha = 0.5) +
labs(title = "Канада", x = "Рост (см)", y = "Вес (кг)") +
theme_minimal()
p3 <- ggplot(data %>% filter(country == "Великобритания"), aes(x = height, y = weight)) +
geom_point(alpha = 0.5) +
labs(title = "Великобритания", x = "Рост (см)", y = "Вес (кг)") +
theme_minimal()
p4 <- ggplot(data %>% filter(country == "Австралия"), aes(x = height, y = weight)) +
geom_point(alpha = 0.5) +
labs(title = "Австралия", x = "Рост (см)", y = "Вес (кг)") +
theme_minimal()
grid.arrange(p1, p2, p3, p4, ncol = 2)
Есть ли что-то в R, что позволяет автоматически создавать каждый график с правильными названиями и объединять их на одной странице, вместо того чтобы делать это вручную?
Сейчас я делаю это вручную, и это занимает много времени (например, у меня 20 таких графиков) — разве это невозможно сделать автоматически?
Если вы не хотите фасетов, то лучший вариант — написать свою функцию для построения графиков и применить ее к данным. Например, вот так:
my_fun <- function(data, title) {
ggplot(data, aes(x = height, y = weight)) +
geom_point(alpha = 0.5) +
labs(title = title, x = "Рост (см)", y = "Вес (кг)") +
theme_minimal()
}
spl <- split(data, data$country)
my_plots <- purrr::map2(spl, names(spl), my_fun)
patchwork::wrap_plots(my_plots)
Ответ или решение
Для создания нескольких графиков в R, связанных с разными странами, вы можете использовать ggplot2
совместно с purrr
и patchwork
, что позволит автоматизировать процесс генерации и отображения графиков. Ниже приведен пошаговый код, который поможет вам создать графики для каждой страны автоматически и расположить их на одной странице.
# Загружаем необходимые библиотеки
library(ggplot2)
library(dplyr)
library(purrr)
library(patchwork)
# Генерируем пример данных
set.seed(123)
data <- data.frame(
height = rnorm(1000, mean = 170, sd = 10),
weight = rnorm(1000, mean = 70, sd = 15),
country = sample(c("USA", "Canada", "UK", "Australia"), 1000, replace = TRUE)
)
# Определяем функцию для создания графика
my_fun <- function(data, title) {
ggplot(data, aes(x = height, y = weight)) +
geom_point(alpha = 0.5) +
labs(title = title, x = "Рост (см)", y = "Вес (кг)") +
theme_minimal()
}
# Разделяем данные по странам
spl <- split(data, data$country)
# Создаем список графиков
my_plots <- map2(spl, names(spl), my_fun)
# Объединяем графики в один объект
final_plot <- wrap_plots(my_plots)
# Выводим финальный график
print(final_plot)
Объяснение кода:
-
Импорт библиотек: Мы импортируем библиотеки
ggplot2
для создания графиков,dplyr
для обработки данных,purrr
для функционального программирования иpatchwork
для объединения графиков. -
Генерация данных: Мы создаем примерный набор данных с высотой, весом и страной.
-
Определение функции
my_fun
: Создаем функцию, которая принимает подмножество данных и название страны. Эта функция генерирует график разброса с заданными параметрами. -
Разделение данных на подмножества: Мы используем функцию
split
, чтобы разбить данные на группы по странам. -
Создание графиков: С помощью функции
map2
мы применяемmy_fun
к каждому подмножеству и его названию, создавая список графиков. -
Объединение графиков: С помощью функции
wrap_plots
мы объединяем все графики в один объект. -
Вывод графиков: Мы выводим объединенный график на экран.
Таким образом, вы можете автоматически создавать множество графиков без необходимости вручную настраивать каждый из них. Это существенно упростит ваш рабочий процесс, особенно если у вас есть много стран или категорий.