如何在 r shiny 中制作交互式雷达图?

How do I make an interactive radar chart in r shiny?

我是 r 和 shiny 的新手,我目前正在从事我的第一个个人项目。我的项目是关于口袋妖怪的,我目前在创建交互式雷达图时遇到问题。我曾尝试在本网站上查看有关 r 和雷达图的其他问题,但无法真正找到正确的答案,因为数据集通常采用不同的格式,而且答案没有提供交互方式。

我想要实现的目标:创建一个交互式雷达图,用户可以在其中 select 一只神奇宝贝,雷达图将显示该神奇宝贝的基本统计数据(生命值、攻击力、防御力等)

数据集:

       name hp defense attack sp_attack sp_defense speed
1  Bulbasaur 45      49     49        65         65    45
2    Ivysaur 60      63     62        80         80    60
3   Venusaur 80     123    100       122        120    80
4 Charmander 39      43     52        60         50    65
5 Charmeleon 58      58     64        80         65    80
6  Charizard 78      78    104       159        115   100
...

ui.R:

library(shiny)
library(plotly)


ui <- navbarPage(title = "Pokemon Research",
                 tabPanel(title = "Types and Stats",
                          sidebarPanel(
                            selectInput(inputId = "diff_stat", 
                                        label = "Different Types and their Base Statistics",
                                        choices = c("hp", "attack", "defense", "special_attack", 
                                                    "special_defense", "speed", "total"))
                          ),
                          mainPanel(plotlyOutput("type"))),
                 tabPanel(title = "Pokemon Statistics",
                          sidebarPanel(
                            selectInput(inputId = "indv",
                                        label = "Pokemon",
                                        choices = data$name
                          ),
                          #IDK WHAT TO PUT HERE FOR THE MAINPANEL
                          )))
                          

server.R:

library("shiny")
library("ggplot2")

data <- read.csv("../data/pokemon.csv", stringsAsFactors = FALSE)

type_data <- data %>% 
  select(name, type1, hp, defense, attack, sp_attack, sp_defense, speed) %>% 
  group_by(type1) %>% 
  summarise(hp = mean(hp),
            attack = mean(attack),
            defense = mean(defense),
            special_attack = mean(sp_attack),
            special_defense = mean(sp_defense),
            speed = mean(speed),
            total = mean(attack + defense + hp + sp_attack + sp_defense + speed))

indv_data <- data %>% 
  select(name, hp, defense, attack, sp_attack, sp_defense, speed)

server <- function(input, output) {
  output$type <- renderPlotly({
    ggplot(data = type_data, mapping = aes_string(x = "type1", y = input$diff_stat)) +
      geom_line(group = 1) +
      geom_point() +
      labs(x = "Types",
           y = "Base Stat (avg)")
  })
  output$radar <- renderPlot({
    #WHAT DO I PUT HERE TO MAKE THE RADAR CHART
  })
}

非常感谢任何帮助!

这可以提供帮助。我只包含了雷达图的代码。

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

pokemons <- 
read_table('
  name      hp  defense attack sp_attack sp_defense speed
  Bulbasaur 45      49     49        65         65    45
    Ivysaur 60      63     62        80         80    60
   Venusaur 80     123    100       122        120    80
 Charmander 39      43     52        60         50    65
 Charmeleon 58      58     64        80         65    80
  Charizard 78      78    104       159        115   100')



ui <- navbarPage(title = "Pokemon Research",

                 tabPanel(title = "Pokemon Statistics",
                          sidebarPanel(
                              selectInput(inputId = "indv",
                                          label = "Pokemon",
                                          choices = pokemons$name, 
                                          selected = 'Bulbasaur')
                              ),
                          mainPanel(
                              plotlyOutput('radar') #the radar plot
                          )
                          ))

server <- function(input, output, session) {

    output$radar <- renderPlotly({
        pkmn <- filter(pokemons, name == input$indv)
        
        r <- map_dbl(pkmn[, 2:6], ~.x)
        nms <- names(r)
        
        #code to plot the radar
        fig <- plot_ly(
            type = 'scatterpolar',
            r = r,
            theta = nms,
            fill = 'toself',
            mode = 'markers'
        ) 
        fig <- fig %>%
            layout(
                polar = list(
                    radialaxis = list(
                        visible = T,
                        range = c(0,max(r))
                    )
                ),
                showlegend = F
            )
    })
}

shinyApp(ui, server)