Home > database >  My shiny app does not show the plot change for switching different countries
My shiny app does not show the plot change for switching different countries

Time:08-19

Not sure why my code shows all the countries' plots at the same time, I want to make it display only the country that's selected by the user. Does anyone know what went wrong with the code?

library(shiny)
require(readr)
countries <- read.csv("~/Desktop/share-deaths-suicide.csv")

# Define UI for application that draws a scatterplot
ui <- fluidPage(
  
  # Application title
  titlePanel("Country Data"),
  
  # Sidebar with a slider input for number of bins 
  sidebarLayout(
    sidebarPanel(
      selectInput("Entity",
                  "countries",
                  paste(countries$Entity), 
                  selected = "China", multiple = FALSE)
    ),
    
    # Show a plot of the generated distribution
    mainPanel(
      plotOutput("countryPlot")
    )
  )
)
# Define server logic required to draw a scatterplot
server <- function(input, output) {
  
  output$countryPlot <- renderPlot({
    country = input$Entity
    plot(countries$Year, countries$`Deaths...Self.harm...Sex..Both...Age..All.Ages..Percent`, col=ifelse(countries$Entity==country, "red","black"),
         main = "Sucide Rate of Countries", xlab = "Year", ylab = "Sucide rate",log="xy")
    options(scipen=999)
  })

}

# Run the application 
shinyApp(ui = ui, server = server)

CodePudding user response:

The issue is that you do not filter your data for the selected country. According to your code only the color is changed for the selected country.

To fix you issue you have to filter your data before passing it to plot. To this end you could add a reactive which filters the data. The filtered data could then be used via countries_filtered() where the parantheses are important. Additionally I have fixed an issue with your selectInput. Instead of passing the vector of entities use only the unique values for the choices argument.

As you provided no example data (to this end I would suggest to have a look at how to provide provide a minimal reproducible example) I use the gapminder dataset as example data:

library(shiny)

# Example data
library(gapminder)
countries <- gapminder
names(countries)[c(1, 3, 4)] <- c("Entity", "Year", "Deaths...Self.harm...Sex..Both...Age..All.Ages..Percent")

# Define UI for application that draws a scatterplot
ui <- fluidPage(
  
  # Application title
  titlePanel("Country Data"),
  
  # Sidebar with a slider input for number of bins 
  sidebarLayout(
    sidebarPanel(
      selectInput("Entity",
                  "countries",
                  choices = unique(countries$Entity), 
                  selected = "China", multiple = FALSE)
    ),
    
    # Show a plot of the generated distribution
    mainPanel(
      plotOutput("countryPlot")
    )
  )
)
# Define server logic required to draw a scatterplot
server <- function(input, output) {
  countries_filtered <- reactive({
    req(input$Entity)
    countries[countries$Entity == input$Entity, ]  
  })
  
  output$countryPlot <- renderPlot({
    country = input$Entity
    plot(countries_filtered()$Year, countries_filtered()$`Deaths...Self.harm...Sex..Both...Age..All.Ages..Percent`, 
         col=ifelse(countries$Entity==country, "red","black"),
         main = "Sucide Rate of Countries", xlab = "Year", ylab = "Sucide rate",log="xy")
    options(scipen=999)
  })
  
}

# Run the application 
shinyApp(ui = ui, server = server)
#> 
#> Listening on http://127.0.0.1:4061

CodePudding user response:

1: You need to filter the dataset for the input country And I will demonstrate this using ggplot:

    output$countryPlot <- renderPlot({
        countries %>%
        filter(country == input$Entity) %>%
        plot(aes(Year, countries$`Deaths...Self.harm...Sex..Both...Age..All.Ages..Percent`, color= Entity))  
    geom_point()  
             labs(main = paste("Sucide Rate of", input$Entity), xlab = "Year", ylab = "Sucide rate")  
scale_y_log10()  
scale_x_log10()  
scale_fill_manual(values=c("red", "black"))
        options(scipen=999)
      })

I am not exactly sure why you wanted to color the points of the scatter plot based on "entity" as it seems that entity is the country input and the original plot would change the color of the points based on the user selection. In my above code, it would change the entire plot to only show the selected country, and changes the title based on the country selected as well.

  • Related