0

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

我想要实现的目标:创建一个交互式雷达图,用户可以在其中选择一个口袋妖怪,雷达图将显示口袋妖怪的基本统计数据(hp、攻击、防御等)

数据集:

       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
                          )))
                          

服务器.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
  })
}

任何帮助是极大的赞赏!

4

1 回答 1

0

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

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)
于 2021-06-19T23:03:55.850 回答