根据缩放比例在交互式绘图上重新缩放 y 轴

Rescaling of y axis on an interactive plot depending on zoom

我在 rshiny 上有一个交互式绘图,我希望轴根据用户缩放的位置动态缩放。我想我可以使用 scale_y_continuous 来使用 ylim 的动态元素,但是我需要知道用户当前帧的下限和上限 y 值(已缩放)。有没有办法用 ggplot/rshiny 来实现这个?

require(shiny)
library(dplyr)
library(ggplot2)

ui <- fluidPage(
  titlePanel(title=h4("example", align="center")),
  mainPanel(plotlyOutput("plot"))
  )

##server
server <- function(input,output){
  dat<-reactive({
    num<-c(1,2,3,4,5,6,7,8,9)
    let<-c("A","B","C","D","E","F","G","H","I")
    df<-data.frame(num,let)
    df
  })

  output$plot<-renderPlotly({
    gg <- ggplot(dat(),aes(x=let,y=num))+geom_point(aes(colour='red'))
    gg2 <- ggplotly(gg) %>% layout(dragmode="select")
    gg2
  })
}

shinyApp(ui = ui, server = server)

试试这个。它不使用 plotly,但相同的一般想法。本质上它将数据过滤到画笔。双击将 return 全开。

require(shiny)
library(dplyr)
library(ggplot2)

ui <- fluidPage(
  titlePanel(title=h4("example", align="center")),
  mainPanel(
    plotOutput("plot", brush = brushOpts("brush_p")))
  )

##server
server <- function(input,output){
  dat<-reactive({
    num<-c(1,2,3,4,5,6,7,8,9)
    let<-c("A","B","C","D","E","F","G","H","I")
    df<-data.frame(num,let)
    df
  })

  dat2 <- reactive({
    y_max <- input$brush_p$ymax
    y_min <- input$brush_p$ymin
    if(is.null(y_max)) return(dat())
    dat() %>% filter(num > y_min & num < y_max)
  })

  output$plot<-renderPlot({
    gg <- ggplot(dat2(),aes(x=let,y=num))+geom_point(aes(colour='red'))
    gg
  })
}

shinyApp(ui = ui, server = server)

reprex 创建于 2018-08-19 包 (v0.2.0).