如何在RStudio中用Shiny制作UFO目击数据交互式ggplot绘图
实现方案
前置修正点
你现有代码存在2个基础问题需要先调整:
- 输入ID大小写不匹配:UI中选择器的ID定义为
Country(首字母大写),Server中调用时需要写input$Country,你原来写的input$country会取不到值 - 需提前加载
dplyr包用于数据过滤,同时建议把数据集读取逻辑放在Server代码外全局位置,避免每次绘图都重复读取数据
完整修改后代码
ui.r 代码(基本无改动,仅补充包引入和中文适配)
library(shiny) library(ggplot2) library(dplyr) shinyUI(fluidPage( titlePanel("UFO目击记录分析"), sidebarLayout( sidebarPanel( selectInput("Country", "选择展示国家:", choices = list("美国" = 'USA', "加拿大" = 'CANADA'), ) ), mainPanel( plotOutput("ufoPlot") ) ) ))
server.r 代码
library(shiny) library(ggplot2) library(dplyr) # 提前读取数据集,这里替换为你实际的数据集读取路径 ufo_data_filter <- read.csv("你的UFO数据集路径.csv", stringsAsFactors = FALSE) shinyServer(function(input, output) { output$ufoPlot <- renderPlot({ # 筛选对应国家的数据,同时去掉形状为空的无效记录 filtered_data <- ufo_data_filter %>% filter(Country == input$Country, !is.na(Shape)) %>% # 按UFO形状分组,统计每个形状的目击次数 count(Shape, name = "sight_count") # 生成柱状图 ggplot(filtered_data, aes(x = Shape, y = sight_count)) + geom_col(fill = "#2c3e50", alpha = 0.8) + labs(x = "UFO形状", y = "目击次数", title = paste0(input$Country, " UFO不同形状目击次数统计")) + theme_bw() + # X轴标签旋转45度,避免文字重叠 theme(axis.text.x = element_text(angle = 45, hjust = 1)) }) })
功能说明
- 侧边栏切换国家选项后,绘图会自动更新对应国家的统计结果
- 自动合并同形状的目击记录计数,无需提前做数据聚合
- 针对X轴标签可能过长的问题做了旋转优化,展示更清晰
内容的提问来源于stack exchange,提问作者FrankRoss
相关产品推荐
相关产品推荐

