R Shiny ggplot x轴年份标签超出网格的两种解决方案咨询
方案1:调整x轴展示规则,限定标签在网格范围内
修改核心逻辑:将离散x轴改为连续轴,通过expand参数控制x轴两侧留白,避免最右侧标签超出绘图网格。
仅需修改renderPlot中ggplot的代码块,修改后代码如下:
output$correlation_plot <- renderPlot({ ecdsubset <- yearrange() ecdsubset <- melt(ecdsubset, id = "year") validate(need(input$feature, 'Check at least one item.')) ggplot(ecdsubset,aes(x=as.numeric(year),y=value,color=variable))+geom_line(size=1)+ # 改用连续x轴,指定breaks为选中区间的整数年份,expand控制两侧留白 scale_x_continuous(breaks = seq(input$year[1], input$year[2], 1), limits = c(input$year[1], input$year[2]), expand = c(0.02, 0.02)) })
参数说明:expand = c(0.02,0.02)会在x轴的起止位置各增加2%的留白,刚好容纳边缘的年份标签,不会超出网格范围。
方案2:限制滑块可选区间,禁止选择无数据的年份
修改核心逻辑:提前从数据中提取有有效数据的年份范围,直接限制滑块的可选边界,从根源上避免用户选中无数据的2020、2021年。
需要修改两处代码:
- 读取数据后新增有效年份提取逻辑
- 修改滑块输入的min、max参数为有效年份的边界值
修改后的完整代码如下:
library(shiny) library(shinydashboard) library(dplyr) library(tidyverse) library(reshape) library(scales) ecd <- read.csv("ecd-figures.csv") # 新增:提取有完整数据的年份,去重后排序 valid_years <- unique(ecd[complete.cases(ecd), ]$year) %>% sort() c( "No of case" = "no_of_case", "Minor Case" = "minor_case", "All Non Fatal Case" = "all_non_fatal_case", "Fatal Case" = "fatal_case" ) -> vec ui <- fluidPage(sidebarLayout( sidebarPanel ( checkboxGroupInput("feature", "Feature", vec), # 修改滑块的min、max为有效年份的边界,不要写死2015、2021 sliderInput( "year", "Year", min = min(valid_years), max = max(valid_years), value = c(min(valid_years), max(valid_years)), sep = "", step = 1 ) ), mainPanel(tabsetPanel( tabPanel("Plot", plotOutput("correlation_plot")), tabPanel("Table", tableOutput("ecd")) )) )) server <- function(input, output) { yearrange <- reactive({ ecd %>% subset(year %in% input$year[1]:input$year[2]) %>% select(c(year, input$feature)) }) output$correlation_plot <- renderPlot({ ecdsubset <- yearrange() ecdsubset <- melt(ecdsubset, id = "year") validate(need(input$feature, 'Check at least one item.')) ggplot(ecdsubset,aes(x=year,y=value,color=variable))+geom_line(size=1)+ scale_x_discrete(limits=c(input$year[1]:input$year[2])) }) output$ecd <- renderTable({ yearrange() }) } shinyApp(ui, server)
如果后续数据更新补充了2020、2021年的指标,代码会自动识别新增的有效年份,不需要手动修改滑块参数。
内容的提问来源于stack exchange,提问作者ronzenith
相关产品推荐
相关产品推荐

