【问题标题】:How do I make an interactive radar chart in r shiny?如何在 r 中制作交互式雷达图?
【发布时间】:2021-09-04 03:09:01
【问题描述】:

我对 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
  })
}

非常感谢任何帮助!

【问题讨论】:

  • 这能回答你的问题吗:stackoverflow.com/a/37778091/2761575
  • 你能像在普通脚本中那样在闪亮的上下文之外创建雷达图吗?如果您缩小问题的范围并分解为多个部分,您可能会找到更好的答案。

标签: r shiny radar-chart spider-chart


【解决方案1】:

这会有所帮助。我只包含了雷达图的代码。

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    相关资源
    最近更新 更多