R Shiny app sliderInput 控制 GGplot 中的 x 轴

标签 r ggplot2 slider shiny

我有 25 辆车参加比赛,跑了 58 圈。

Static plot showing all 58 laps

我想要一个 slider 来控制图表中显示的圈数作为 ggplot 中的 x 轴。

用户界面:

sliderInput("lapsView",
              "Choose laps to view:",
              min = 1,
              max = 58,
              value = 10)

服务器:

library(shiny)

shinyServer(function(input, output) {


  output$distPlot <- renderPlot({

    f1<- read.csv("F1 2011 Turkey - Fuel Corrected Lap Times.csv", header = T)

    str(f1)
    library(ggplot2)

    f1$Driver<-as.factor(f1$Driver)


    p1 <- ggplot(data=f1, 
                  aes(x = Lap, y= Lap.Time, colour = Driver)) + 
      ylim(80,100)+
      geom_line() + geom_point()                    

    # I combined p1 with p2 to save space.

    p2 <- p1  + coord_polar() 
    p2

  })

})

我想将 x=Lap 更改为本质上的 x = sliderInput。 我尝试了 x = input$lapsView,但每个都只得到一个点。

请帮忙。

Result

最佳答案

如果你真的想用sliderInput来做到这一点您可以执行以下操作:

  • 更改参数值valuesliderInput来自10到向量c(1, 58)

  • 创建一个整数序列,其最小值和最大值由范围 slider 给出

    lapsView <- seq(input$lapsView[1], input$lapsView[2])

  • f1 进行子集化。这是必要的,因为否则你会得到不同长度的向量,并且 ggplot 会提示

    f1_new <- f1[which(f1$Lap %in% lapsView), ]

  • 最终在 ggplot 中使用新的数据集

Ui.R

  sliderInput("lapsView",
              "Choose laps to view:",
              min = 1,
              max = 58,
              value = c(1, 58),
              dragRange = TRUE), 

  checkboxGroupInput("driverID", 
                     "Driver", 
                     c("Sebastian Vettel" = 1, "Mark Webber" = 2, 
                       "Fernando Alonso" = 3, "Lewis Hamilton" = 4, 
                       5, 6, 7, 8, 9, 10, 11, 12 ,13 ,14, 15, 16, 17, 18, 19, 20, 21, 22, 23,24,25),
                     selected = FALSE, inline = FALSE, width = NULL)

服务器.R

library(shiny)
library(DT)
server <- shinyServer(function(input, output) {

    output$distPlot <- renderPlot({

      f1 <- read.csv("F1 2011 Turkey - Fuel Corrected Lap Times.csv", header = T)

      f1$Driver <- as.factor(f1$Driver)

      lapsView <- seq(input$lapsView[1], input$lapsView[2]) 

      # driverID <- seq(input$driverID[1], input$driverID[2]) 
      driverID <- input$driverID  
      req(driverID) # require that driverID is not NULL - it would break down the code below

      # Subsetting: 
      f1_new <- f1[which(f1$Lap %in% lapsView & f1$Driver %in% driverID),] 
      p1 <- ggplot(data = f1_new, aes(x = Lap, y = Lap.Time, colour = Driver)) + 
        ylim(80, 100)+ geom_line() + geom_point()
      p2 <- p1 + coord_polar() 
      p2

    })

    observe({
      # input$lapsView returns in this case two values - minimum and maximum 
      # (initially 1 and 58)
      # If we used these values we would have only two points - 1 and 58
      # As we want to have all points in between 1 and 58 we create a sequence
      # with the function `seq`.
      # If you wanted to have a sequence in which starting value differs and 
      # maximum is always given by 58 you could do following:

      #  sliderInput:
      # - remove dragRange = TRUE 
      # - change value from c(1,58) to 1
      #  server
      # - lapsView <- seq(input$lapsView[1], 58) 


      # You want to add another condition to subsetting. It looks fine but 
      # you should change 
      # driverID <- seq(input$driverID[1], input$driverID[2])
      # to 
      # driverID <- input$driverID 
      # because input$driverID alrady contains all choices
      # You have to be careful about the case when there is nothing checked.
      # driverID yields in this case NULL
      # It may break down the code so it is good to use the function `req`


      # Here you can observe values of inputs in the console. It is a 
      # good way to see "what's going on" and to debug the code.

      print(" ================================================== ")
      print("Input$driverID")
      print(input$driverID)

      print("---------------")
      print("input$lapsView")
      print(input$lapsView)
      # two values - min and max

      print(" ================================================== ")
      print('')
      print('')
      print('')

    })

  })

关于R Shiny app sliderInput 控制 GGplot 中的 x 轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38813269/

相关文章:

r - 为我的逻辑回归模型生成逻辑曲线

r - 在最新版本的 rgl 软件包中,legend3d 功能不起作用

r - 使用ggplot绘制SpatialPolygonsDataFrame

r - 在多面 ggplot 上注释不同的方程

javascript - 光滑 slider 问题 : displaying thumbnails in vertical columns

r - 如何在 R 中获取 Google Trends 前 10 个搜索词?

r - 在ggplot中结合条形图和散点图

r - 将数据集中不存在的值添加到图例

jquery - Nivo Slider Jquery 插件 - 图像自动调整大小

jquery - 触摸设备上的光滑轮播中同时出现 2 个点