Как я могу использовать условия для добавления данных в ggplot, чтобы сделать его интерактивным? - PullRequest
0 голосов
/ 17 мая 2019

Это мой первый вопрос по stackoverflow, поэтому, пожалуйста, прости меня, если моя проблема не совсем описана.Я работаю над интерактивным сюжетом, используя R блестящий.Цель состоит в том, чтобы сравнить данные о качестве воздуха для разных городов.Это должно быть сделано в ggplot, где пользователь может выбрать загрязняющее вещество (ось Y) и возможный коэффициент корреляции (например, температура воздуха, ось X).Затем пользователь должен иметь возможность выбрать все города (например, CheckboxGroupInput), из которых должны быть нанесены данные.Выбор двух переменных (ось x / y) работает хорошо, однако я изо всех сил пытаюсь построить несколько городов одновременно.

Я уже создал входы, которые, кажется, работают нормально.Я также могу построить один город за один раз.Мне также удалось построить несколько выбранных городов, однако они не отображаются в одном и том же ggplot, но виден только самый верхний график (см. Упрощенный код ниже).

UI:

library(shiny)
library(ggplot2)

berlin_d <- read.csv("berlin_d.csv")
london_d <- read.csv("London_d.csv")
warsaw_d <- read.csv("Warsaw_d.csv")


checkboxGroupInput(
          inputId = "city",
          label = "select a city/multiple cities",
          choices = c(
            "Berlin" = "Berlin",
            "London" = "London",
            "Warsaw" = "Warsaw"
          )
        ),

      selectInput(
        inputId = "box1",
        label = "select a variable to plot (x-axis)",
        choices = c("temperature" = "temp", 
          "month" = "month",
          "weekday" = "weekday"
        ),
        selected = "temp"
      ),


    selectInput(
      inputId = "box2",
      label = "select a pollutant to plot (y-axis)",
      choices = c("Ozone" = "O3",
                  "NO2" = "NO2",
                  "PM10" = "PM10"
      ),
    )

Сервер:

output$plot <- renderPlot(ggplot()+
geom_point(if (input$city=="Berlin") {aes(berlin_d[[input$box1]], berlin_d[[input$box2]])})+
geom_point(if (input$city=="London") {aes(london_d[[input$box1]], london_d[[input$box2]])})+
geom_point(if (input$city=="Warsaw") {aes(warsaw_d[[input$box1]], warsaw_d[[input$box2]])})
)

Я не понимаю, почему данные не отображаются на одном графике.Есть ли способ отобразить данные в одном ggplot, и при этом есть возможность выбрать города?

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 17 мая 2019

Чтобы ответить на ваш вопрос, небольшого изменения в вашем коде должно быть достаточно для создания функциональности, которую вы ищете.

Вы должны посмотреть на результат ввода $ city. Если вы установите более одного флажка, длина вектора изменится, и тогда при проверке предложения if будет использоваться только первый элемент. Чтобы избежать этого, вы можете переписать условие if следующим образом:

if ("Berlin" %in% input$city)

Весь сюжет будет выглядеть так.

ggplot() +
    geom_point(if ("Berlin" %in% input$city) {aes(berlin_d[[input$box1]], berlin_d[[input$box2]])}) +
    geom_point(if ("London" %in% input$city) {aes(london_d[[input$box1]], london_d[[input$box2]])}) +
    geom_point(if ("Warsaw" %in% input$city) {aes(warsaw_d[[input$box1]], warsaw_d[[input$box2]])})

Однако гораздо лучше было бы создать один набор данных, содержащий все данные, где city - это просто переменная группировки. Затем создайте реактивное выражение, подгруппировав данные в блестящем в соответствии с входным фильтром (input $ city). Затем вы можете создать график одним вызовом ggplot и установить, например, город в качестве факторной переменной для цвета.

...