Как подмножество данных в диаграмме панели ggplot?

#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 строки. Имеет ли это смысл?