Home > database >  create and showing ranking with bar chart in R shiny
create and showing ranking with bar chart in R shiny

Time:06-21

I'm new in programming language especially R. I have data frame and want to show top 3 of my data and sort from the biggest value using bar chart. I have tried some codes but failed to create proper chart. Here is my latest code :

my_data <- data.frame(x1 = c("a","b", "c","d","e","f","g","h"),           
              x2 = c(200, 200, 100,200,200,100,200,100),
              x3 = c(100,400,500,50,100,300,100,50))
df1 <- my_data[order(my_data$x3),] #order by x3 value, to create rank
ui <- tabPanel("Test",
           sidebarLayout(
             sidebarPanel(
               selectInput(inputId = "why",  
                           label = "1. Select",  
                           choices = df1$x2),  
             ),
             mainPanel(plotlyOutput("test"))
           ))
server <- function(input, output, session) {
 output$test <- renderPlotly({
 df2 <- df1 %>% 
   filter(x2 ==input$why) #filter by x2
 p <-ggplot(df2,
           aes(x = x1, y=x3))   
  geom_bar(stat = "identity")
fig <- ggplotly(p)
fig
  })}
shinyApp(ui = ui, server = server)

the bar chart I created was not ordered correctly (based on x3 values), and I also only want to show top 3 of my data enter image description here

CodePudding user response:

To filter for the top 3 rows you could use dplyr::slice_max and to reorder your bars use e.g. reorder. Simply reordering the dataset will not work.

library(shiny)
library(dplyr)
library(plotly)

ui <- tabPanel(
  "Test",
  sidebarLayout(
    sidebarPanel(
      selectInput(
        inputId = "why",
        label = "1. Select",
        choices = unique(df1$x2),
        selected = 200
      ),
    ),
    mainPanel(plotlyOutput("test"))
  )
)
server <- function(input, output, session) {
  output$test <- renderPlotly({
    df2 <- df1 %>%
      filter(x2 == input$why) %>%
      slice_max(x3, n = 3, with_ties = FALSE)
    
    p <- ggplot(
      df2,
      aes(x = reorder(x1, -x3), y = x3)
    )  
      geom_bar(stat = "identity")
    fig <- ggplotly(p)
    fig
  })
}
shinyApp(ui = ui, server = server)
#> 
#> Listening on http://127.0.0.1:8022

CodePudding user response:

I know the question is already answered, but I encourage you to keep your server function as small as possible and try to wrap long series of code into functions.

Here is an example of what I mean

library(tidyverse)
library(shiny)
library(plotly)

my_data <- data.frame(x1 = c("a","b", "c","d","e","f","g","h"),           
                      x2 = c(200, 200, 100,200,200,100,200,100),
                      x3 = c(100,400,500,50,100,300,100,50))
df1 <- my_data[order(my_data$x3),] #order by x3 value, to create rank

myPlot <- function(data, input) {
  
  df <- data |> 
    filter(x2 == input) #filter by x2
  
  p <-ggplot(df, aes(x = reorder(x1, -x3), y=x3))   
    geom_bar(stat = "identity")
  

  return(ggplotly(p))
}
ui <- tabPanel("Test",
               sidebarLayout(
                 sidebarPanel(
                   selectInput(inputId = "why",  
                               label = "1. Select",  
                               choices = df1$x2),  
                 ),
                 mainPanel(plotlyOutput("test"))
               ))

server <- function(input, output, session) {
  
  output$test <- renderPlotly({
    
    myPlot(df1, input$why)
    
  })
}

shinyApp(ui = ui, server = server)
  • Related