Как я могу заполнить свою диаграмму плотности 2 факторами с помощью shiny

#r #ggplot2 #shiny #heatmap

#r #ggplot2 #блестящий #тепловая карта

Вопрос:

На моей первой панели у меня есть график, на котором я ввожу данные щелчком или двойным щелчком в зависимости от ситуации. Если это один щелчок, он классифицируется как выстрел, а если это двойной щелчок, он классифицируется как цель.

Одновременно на другой вкладке я создаю тепловую карту всех этих снимков. Однако в моей тепловой карте (созданной в моем коде в output $ chart) Я хотел бы иметь два разных цвета на одной тепловой карте. Один цвет представляет удары, а другой — цель.

Спасибо за вашу помощь

 library(shiny)
library(ggplot2)

ui <- fluidPage(
  titlePanel("Hockey"),
  tags$img(height = 100, width = 100,
           src = "Logo.png"),
  sidebarPanel(
    textInput(inputId = "date",
              label = "Date", 
              value = "yyyy/mm/dd"),
    textInput(inputId = "team",
              label = "Team Name", 
              value = "Team Name"),
    selectInput("shot", "shot type:",
                list(`Shot Type` = list("wrist shot", "slap shot", "snap shot", "backhand", "tap in", "deflection", "one timer", "wrap around"))),
    actionButton("reset", "Clear")),
  mainPanel(tabsetPanel(
    tabPanel("Track", plotOutput(outputId = "hockeyplot", click = "plot_click", dblclick = "plot_dblclick")),
    tabPanel("Chart", plotOutput(outputId = "chart")),
   

server <- function(input, output){
  
  rv <- reactiveValues(
    df = data.frame(
      x = numeric(),
      y = numeric(),
      Date = as.Date(character()),
      Team = character(),
      ShotType = character(),
      Type = factor()
    )
  )
  
  output$hockeyplot = renderPlot({ 
    ggplot(rv$df,
           aes(x = x, y = y))   coord_flip()   lims(x = c(0, 100), y = c(42.5, -42.5))   geom_blank   geom_point( aes(colour = factor(Type)), size = 5 )   theme(legend.position = "none")})
  
  
   observeEvent(input$plot_click, {
    rv$df <- rbind(rv$df, data.frame(
      x = input$plot_click$y,
      y = input$plot_click$x,
      Date = input$date, 
      Team = input$team, 
      ShotType = input$shot, 
      Type = "Shot"))
  })
  
  observeEvent(input$plot_dblclick, {
    rv$df <- rbind(rv$df, data.frame(
      x = input$plot_dblclick$y,
      y = input$plot_dblclick$x,
      Date = input$date, 
      Team = input$team,  
      ShotType = input$shot, 
      Type = "Goal"))
  })
  
  observeEvent(input$reset,{
    rv$df <- rv$df[-nrow(rv$df),]
  })
  

  
  output$chart = renderPlot({
    ggplot(rv$df, aes(x = x, y = y))  
      coord_flip() 
      lims(x = c(0, 100), y = c(42.5, -42.5))  
      geom_blank 
      theme(legend.position = "none")  
      stat_density_2d(aes(fill = "shot"), geom = 'polygon', alpha = 0.4) 
  })

  

Комментарии:

1. Откуда это gg_rink ?

2. Это отдельная функция, чтобы сделать ее проще и проще, я просто заменил gg_rink на geom_blank, который работает по тому же принципу. Спасибо за вашу помощь

Ответ №1:

Вот рабочий пример.

Я создал вектор my_colors для присвоения цветов «Shot» и «Goal», чтобы они соответствовали цифрам и не менялись, если Type factor имеет разное количество уровней.

Я также включил factor при добавлении строк в ваш rv$df . Таким образом, у вас также не будет изменения цвета при изменении количества уровней Type . Когда я попытался запустить приложение изначально, цвета изменились бы после Type добавления секунды («Выстрел» или «Цель»).

В stat_2_density , вы можете изменить fill на Type . Опять же, вы можете указать scale_fill_manual , чтобы назначить те же цвета.

Пожалуйста, дайте мне знать, если это то, что вы имели в виду.

 library(shiny)
library(ggplot2)

my_colours = c("Shot" = "blue", "Goal" = "green")

ui <- fluidPage(
  titlePanel("Hockey"),
  tags$img(height = 100, width = 100, src = "Logo.png"),
  sidebarPanel(
    textInput(inputId = "date",
              label = "Date", 
              value = "yyyy/mm/dd"),
    textInput(inputId = "team",
              label = "Team Name", 
              value = "Team Name"),
    selectInput("shot", "shot type:",
                list(`Shot Type` = list("wrist shot", "slap shot", "snap shot", "backhand", "tap in", "deflection", "one timer", "wrap around"))),
    actionButton("reset", "Clear")),
  mainPanel(tabsetPanel(
    tabPanel("Track", plotOutput(outputId = "hockeyplot", click = "plot_click", dblclick = "plot_dblclick")),
    tabPanel("Chart", plotOutput(outputId = "chart"))
  ))
)
    
    
server <- function(input, output){
  
  rv <- reactiveValues(
    df = data.frame(
      x = numeric(),
      y = numeric(),
      Date = as.Date(character()),
      Team = character(),
      ShotType = character(),
      Type = factor(levels = c("Shot", "Goal"))
    )
  )
  
  output$hockeyplot = renderPlot({ 
    ggplot(rv$df, aes(x = x, y = y))   
      coord_flip()   
      lims(x = c(0, 100), y = c(42.5, -42.5))   
      geom_blank()   
      geom_point(aes(color = Type), size = 5 )   
      theme(legend.position = "none")  
      scale_color_manual(values = my_colours)
  })
  
  observeEvent(input$plot_click, {
    rv$df <- rbind(rv$df, data.frame(
      x = input$plot_click$y,
      y = input$plot_click$x,
      Date = input$date, 
      Team = input$team, 
      ShotType = input$shot, 
      Type = factor("Shot", levels = c("Shot", "Goal"))))
  })
  
  observeEvent(input$plot_dblclick, {
    rv$df <- rbind(rv$df, data.frame(
      x = input$plot_dblclick$y,
      y = input$plot_dblclick$x,
      Date = input$date, 
      Team = input$team,  
      ShotType = input$shot, 
      Type = factor("Goal", levels = c("Shot", "Goal"))))
  })
  
  observeEvent(input$reset,{
    rv$df <- rv$df[-nrow(rv$df),]
  })
  
  output$chart = renderPlot({
    ggplot(rv$df, aes(x = x, y = y))  
      coord_flip() 
      lims(x = c(0, 100), y = c(42.5, -42.5))  
      geom_blank() 
      theme(legend.position = "none")  
      stat_density_2d(aes(fill = Type), geom = 'polygon', alpha = .4)  
      scale_fill_manual(values = my_colours)
  })
  
}

shinyApp(ui, server) 
  

Комментарии:

1. Точно. Спасибо, Бен, за вашу помощь