You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R Shiny中实现可交互的宝可梦基础属性雷达图

解决方案

依赖说明

  • 本次实现采用plotly原生交互式雷达图,无需额外安装其他雷达图专用包,交互效果更符合需求
  • 需确保已安装dplyr包用于数据处理
  • 如果需要保留英文界面,替换对应位置的中文文本即可

修改后的ui.R代码

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

# 提前加载数据保证selectInput的choices可正常读取
data <- read.csv("../data/pokemon.csv", stringsAsFactors = FALSE)

ui <- navbarPage(title = "宝可梦研究",
                 tabPanel(title = "属性与数值",
                          sidebarPanel(
                            selectInput(inputId = "diff_stat", 
                                        label = "不同属性及其基础数值平均值",
                                        choices = c("hp", "attack", "defense", "special_attack", 
                                                    "special_defense", "speed", "total"))
                          ),
                          mainPanel(plotlyOutput("type"))),
                 tabPanel(title = "单只宝可梦数值",
                          sidebarPanel(
                            selectInput(inputId = "indv",
                                        label = "选择宝可梦",
                                        choices = data$name
                          )),
                          # 补全雷达图输出容器
                          mainPanel(plotlyOutput("radar"))
                 ))

修改后的server.R代码

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

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 = "属性",
           y = "基础数值平均值")
  })
  
  # 补全交互式雷达图渲染逻辑
  output$radar <- renderPlotly({
    # 筛选用户选中的宝可梦数据
    selected_pkm <- indv_data %>%
      filter(name == input$indv)
    
    # 构造雷达图所需的数值和标签向量
    stat_values <- c(selected_pkm$hp, selected_pkm$attack, selected_pkm$defense, 
                     selected_pkm$sp_attack, selected_pkm$sp_defense, selected_pkm$speed)
    stat_labels <- c("生命值", "攻击", "防御", "特攻", "特防", "速度")
    
    # 生成交互式雷达图
    plot_ly(
      type = 'scatterpolar',
      r = stat_values,
      theta = stat_labels,
      fill = 'toself',
      fillcolor = 'rgba(31, 119, 180, 0.5)',
      line = list(color = 'rgb(31, 119, 180)')
    ) %>%
      layout(
        polar = list(
          radialaxis = list(
            visible = TRUE,
            range = c(0, 255) # 宝可梦单项属性最大值为255,固定范围便于对比
          )
        ),
        showlegend = FALSE,
        title = paste0(input$indv, " 基础属性雷达图")
      )
  })
}

关键调整说明

  • ui端提前加载数据,避免selectInput的choices参数读取失败
  • 雷达图采用plotly原生实现,支持悬停查看具体数值、缩放等交互操作
  • 固定雷达图数值范围为0-255,符合宝可梦属性设计规范,不同宝可梦的属性对比更直观
  • 可根据需求自行调整填充色、边框色等样式参数

内容的提问来源于stack exchange,提问作者jejelim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 11:15:03