【问题标题】:Using checkboxGroupInput to show only certain bars on a plot Shiny使用 checkboxGroupInput 仅显示绘图上的某些条形
【发布时间】:2021-08-14 06:48:43
【问题描述】:

我正在使用多文件设置,因此我同时拥有 ui.r 和 server.r 文件。我正在使用下面的数据集(小样本),它查看了 2016 年美国/加拿大不同州/省的 UFO 目击事件。

        Date        Time    AM.PM   Country       City      State   Shape
1   12/21/2016    7:15:00   PM       USA        Waynesboro  VA     Sphere
2   12/21/2016    12:00:00  AM       USA        Louisville  KY     Unknown
3   12/20/2016    10:30:00  PM       USA        Santa Rosa  CA     Sphere
4   12/20/2016    7:00:00   PM       USA        Fresno      CA     Circle
5   12/19/2016    9:53:00   PM       USA        Reymert     AZ     Circle
6   1/11/2016     8:15:00   PM      CANADA     Mississauga  ON     Circle

到目前为止,在我的应用程序中,我创建了一个主面板,它显示一个条形图,其中包含在 x 轴上的“形状”列中观察到的所有不同形状以及在 y 轴上观察到的数量。我在侧面有一个小部件,允许用户选择是否要查看美国或加拿大的数据,并且绘图会相应更改。我现在要做的是使用 checkboxGroupInput 来允许用户过滤掉他们想在绘图的 x 轴上看到的形状。我在我的 UI 文件中使用所有可能的形状编写了该函数,如下所示。现在我被困在如何制作它,以便在应用程序首次启动时选择所有框(没有再次列出所有可能性)。最重要的是,我不确定如何将此功能添加到服务器文件中,以便它会根据用户想要过滤的形状自动更新绘图。感谢您的帮助,谢谢!

用户界面文件:

library(shiny)
library(ggplot2)
library(dplyr)

shinyUI(fluidPage(

    # Application title
    titlePanel("Exploring UFO Sightings"),

    sidebarLayout(
        sidebarPanel(
            selectInput("Country",
                        "Country to Display:",
                        choices = list("USA" = 'USA',
                                       "Canada" = 'CANADA'),
                        ),
            checkboxGroupInput("type",
                               "Select Desired Shapes Observed:",
                               choices = list("Changing" = 'Changing',
                                              "Chevron" = 'Chevron',
                                              "Cigar" = 'Cigar',
                                              "Circle" = 'Circle',
                                              "Cone" = 'Cone',
                                              "Cross" = 'Cross',
                                              "Cylinder" = 'Cylinder',
                                              "Diamond" = 'Diamond',
                                              "Disk" = 'Disk',
                                              "Egg" = 'Egg',
                                              "Fireball" = 'Fireball',
                                              "Flash" = 'Flash',
                                              "Formation" = 'Formation',
                                              "Light" = 'Light',
                                              "Other" = 'Other',
                                              "Oval" = 'Oval',
                                              "Rectangle" = 'Rectangle',
                                              "Sphere" = 'Sphere',
                                              "Teardrop" = 'Teardrop',
                                              "Triangle" = 'Triangle',
                                              "Unknown" = 'Unknown'),
                                    selected = c(#Not sure how to select all)
                               ),
        ),
        # Show a plot of the generated distribution
        mainPanel(
            plotOutput("ufoPlot")
        )
    )
))

服务器文件:

library(shiny)
library(ggplot2)
library(dplyr)


shinyServer(function(input, output) {

    output$ufoPlot <- renderPlot({
        
        ufo_data_filter <- filter(ufo_data, Country == input$Country)
        ggplot(data = ufo_data_filter) +
            geom_bar(mapping = aes(x = Shape))+
            labs(
                title = "Number of Different Shaped UFO Observations",
                x = "Shape of UFO Sighted",
                y = "Number of Observations in 2016"
            )
    })
})

【问题讨论】:

    标签: r ggplot2 dplyr shiny


    【解决方案1】:

    我将您的代码编写为单一语法,但您可以将其调整为 ui/server 形式。 首先,如果数据上可用,您不必编写每一个选择。 checkboxGroupInput 中的 selected 参数可以重复选择,以便在启动时选择它们中的每一个。

    对于绘图,您只需为 Shape 列添加一个额外的过滤器。由于这可以是多项选择,因此%in% 运算符适用于值向量。

    ui <- fluidPage(
      
      # Application title
      titlePanel("Exploring UFO Sightings"),
      
      sidebarLayout(
        sidebarPanel(
          selectInput("Country",
                      "Country to Display:",
                      choices = list("USA" = 'USA',
                                     "Canada" = 'CANADA')),
          checkboxGroupInput("type",
                             "Select Desired Shapes Observed:",
                             choices = unique(ufo_data$Shape),
                             selected = unique(ufo_data$Shape))),
          # Show a plot of the generated distribution
          mainPanel(
            plotOutput("ufoPlot")
          )
        )
      )
      
    
    
    server <- function(input, output, session) {
      
       output$ufoPlot <- renderPlot({
        
        ufo_data_filter <- filter(ufo_data, Country == input$Country & Shape %in% input$type)
        ggplot(data = ufo_data_filter) +
          geom_bar(mapping = aes(x = Shape))+
          labs(
            title = "Number of Different Shaped UFO Observations",
            x = "Shape of UFO Sighted",
            y = "Number of Observations in 2016"
          )
      })
    }
    
    shinyApp(ui, server)
    

    【讨论】:

    • 是的,这太完美了!非常感谢,我脑子里想的太复杂了。
    猜你喜欢
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 2015-06-08
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    相关资源
    最近更新 更多