美文网首页R
shiny与ggplot2结合注意事项

shiny与ggplot2结合注意事项

作者: 太克斯 | 来源:发表于2018-03-21 20:50 被阅读0次

需求:生成范围可选的滑动条,并根据滑动后的范围,动态生成ggplot2图片

library('ggplot2')
library('shiny')

# 定义数据:内含 '时间' '数值' '种类名' 三个列标签
date <- as.Date(c("2013-1-12","2013-1-13","2013-1-14","2013-1-15","2013-1-16","2013-1-17","2013-1-18","2013-1-19"))
num <- c(13,14,12,15,16,18,17,19)
type_name <- c("cc","dd","cc","dd","cc","dd","cc","dd")

d <- data.frame(date,num,type_name)

# 定义UI端
ui <- fluidPage(
  
  # Application title
  titlePanel("select data"),
  
  # Sidebar with a slider input for date range
  sidebarLayout(
    sidebarPanel(
      sliderInput("date",
                  "date range:",
                  min = min(d$date),
                  max = max(d$date),
                  value = c(min(d$date),max(d$date))  # 这个 value 是关键,靠它生成两端可调的滑动条
      )
      
      # Show a plot of the generated plot  
    ),
    mainPanel(
      plotOutput("Plot")
    )
  )
)
# Define server logic required to draw a ggplot chart
server <- function(input, output) {

# 定义 df1 是另一个关键点,要想实现图表的时间范围随着滑动条的变化而改变,df1这个 dataframe必须是 reactive的(反应式的),
# 而且注意subset的操作,是通过 input$date[1] 和input$date[2] 这两个输入来取到的,这样一旦滑动条范围改变,
# 这两个输入值就会改变,而  df1  被 reactive() 函数声明为一个反应值 ,
# 所以 df1 会在 input$date[1] 和 input$date[2] 改变后进行刷新,这样就完成了动态生成 dataframe 的要求

  df1 <- reactive(subset(d,date < input$date[2] & date > input$date[1],select = c(date,num,type_name))) 
    
  output$Plot <- renderPlot({
    p1 <-ggplot(df1(),aes(date,num,colour = type_name))  # 注意第一个参数 df1(),一定要写成函数的形式,虽然在
# 之前定义时,看起来是一个变量,但实际上被  reactive() 函数处理过的对象是一个 反应表达式,只有写成  df1() 的形式,
# 才能在 ggplot() 里运行,如果不加括号,会运行失败

    p1 + geom_line(data=df1(),aes(date,num,colour = type_name)) # 注意这句,geom_line() 的参数不能省略,
# 必须把 'data=' , 和 aes() 写全,因为 df1 会改变,如果不写全,geom_line() 是不知道 输入数据集 是要更新的,
# 不写全的结果是图会画不出来。
  })
}

# 最后说一下 反应值的问题 ,要把输入ggplot()函数的dataframe变成反应式的,而不是把aes()里面的参数变成反应式的,
# 这点一定要注意,否则会报错,画不出来


# Run the application 
shinyApp(ui = ui, server = server)

相关文章

网友评论

    本文标题:shiny与ggplot2结合注意事项

    本文链接:https://www.haomeiwen.com/subject/gujnqftx.html