如何在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
相关产品推荐
相关产品推荐

