#r
Вопрос:
Я пытаюсь создать панельную диаграмму в ggplot с четырьмя переменными, которые все имеют свой собственный масштаб для оси y. Я могу заставить структуру панельной диаграммы работать, но у меня возникают проблемы с тем, чтобы на самом деле поместить каждый набор данных на пояс. Я следовал сценарию, который нашел в Интернете. См.Ниже, однако я получаю следующую ошибку, когда пытаюсь использовать функцию подмножества ниже в сценарии.
Error in .(variable == "Count") : could not find function "."
#load data
#Data source: data analysis-gullies > R Stats Input > Panel Chart
df <- read.csv(file.choose(), header = T)
View(df)
#load library
library(ggplot2)
library(reshape2)
dfm <- melt(df, id.vars =c("Interval"))
View(dfm)
test <- ggplot(dfm, aes(Interval, value, ymin = 0,
ymax = value, colour = "grey20")) scale_colour_identity()
xlim(5,1115) facet_grid(variable ~ ., scales = "free", as.table = FALSE)
theme_bw() theme(panel.spacing = unit(0, "lines"), axis.title.x = element_blank(),
axis.title.y = element_text())
test
test1 <- test geom_col(subset = .(variable == "Count"))
test2 <- test1 geom_col(subset = .(variable == "Length"))
test3 <- test2 geom_col(subset = .(variable == "Area"))
test4 <- test3 geom_col(subset = .(variable == "Volume"))
Ответ №1:
Вы можете использовать patchwork
пакет для объединения отдельных объектов ggplot2, чтобы получить отдельные оси для каждой панели:
library(tidyverse)
library(patchwork)
iris %>%
nest(-Species) %>%
mutate(
plt = data %>% map2(Species, ~ {
.x %>%
ggplot(aes(Sepal.Width, Sepal.Length))
geom_point()
labs(title = .y)
})
) %>%
pull(plt) %>%
wrap_plots()
Вы также можете добавить логику для построения различных графиков на панели:
library(tidyverse)
library(patchwork)
iris %>%
nest(-Species) %>%
mutate(
plt = data %>% map2(Species, ~ {
if(.y == "setosa") {
.x %>%
ggplot(aes(Sepal.Width, Sepal.Length))
geom_point()
labs(title = .y)
} else {
.x %>%
ggplot(aes(Sepal.Width, Sepal.Length))
geom_line()
labs(title = .y)
}
})
) %>%
pull(plt) %>%
wrap_plots()
Если участки панели сильно отличаются друг от друга (например, разные переменные для осей x и y), рекомендуется создавать каждый участок отдельно, а затем вызывать wrap_plots
все объекты участка:
plt1 <- qplot(Sepal.Length, Sepal.Width, data = iris, geom = "point")
plt2 <- qplot(Petal.Length, Petal.Width, data = iris, geom = "line")
wrap_plots(plt1, plt2, nrow = 1)
Комментарии:
1. Спасибо, я попробую. Быстрый вопрос, хотя все ли участки должны быть одного типа или у меня может быть три участка с использованием geom_col и один участок с использованием geom_line?
2. Я редактирую ответ для условного построения графика
3. Что делать, если у меня нет такой переменной, как виды, по которым я хочу сгруппироваться? Мне нужен график зависимости объема от интервала (который, по сути, является расстоянием вдоль реки), тогда следующим графиком будет Площадь от интервала, Длина от интервала, Количество от интервала. У каждого будет свой собственный масштаб. В идеале это будет 1 столбец, 4 строки. Имеет ли это смысл?