Plot

#| standalone: true
#| components: [viewer]
#| viewerHeight: 200

library(shiny)
library(bslib)
library(ggplot2)

ui <- page_fluid(
  layout_column_wrap(
    plotOutput(
      "plot",
      click = "plot_click",
      height = "200px"
    ),
    textOutput("coords")
  )
)

server <- function(input, output) {
  output$plot <- renderPlot({ 
    mpg |> 
      ggplot(aes(hwy, cty)) + 
      geom_point(size = 1) + 
      labs(title = "Click anywhere on the plot")
  }) 

  output$coords <- renderText({ 
    req(input$plot_click) # Ensure values available before proceeding 
    x <- round(input$plot_click$x, 2) 
    y <- round(input$plot_click$y, 2) 
    glue::glue("({x}, {y})") 
  }) 
}

shinyApp(ui, server)
library(shiny)
library(bslib)
library(ggplot2)

ui <- page_fluid(
  plotOutput("plot", click = "plot_click"), 
  textOutput("coords") 
)

server <- function(input, output) {
  output$plot <- renderPlot({ 
    mpg |> 
      ggplot(aes(hwy, cty)) + 
      geom_point() + 
      labs(title = "Click anywhere on the plot")
  }) 

  output$coords <- renderText({ 
    req(input$plot_click) # Ensure values are available before proceeding 
    x <- round(input$plot_click$x, 2) 
    y <- round(input$plot_click$y, 2) 
    glue::glue("({x}, {y})") 
  }) 
}

shinyApp(ui, server)
No matching items

Relevant Functions

  • brushedPoints
    brushedPoints(df, brush, xvar = NULL, yvar = NULL, panelvar1 = NULL, panelvar2 = NULL, allRows = FALSE)

  • nearPoints
    nearPoints(df, coordinfo, xvar = NULL, yvar = NULL, panelvar1 = NULL, panelvar2 = NULL, threshold = 5, maxpoints = NULL, addDist = FALSE, allRows = FALSE)

  • plotOutput
    plotOutput(outputId, width = "100%", height = "400px", click = NULL, dblclick = NULL, hover = NULL, brush = NULL, inline = FALSE, fill = !inline)

  • renderPlot
    renderPlot(expr, width = "auto", height = "auto", res = 72, ..., alt = NA, env = parent.frame(), quoted = FALSE, execOnResize = FALSE, outputArgs = list())

No matching items

Details

Plots can be used as inputs that respond to mouse events. To create a plot that responds to mouse events, you’ll first need to create a plot output:

  1. Add plotOutput() in the UI of your app to create a div in which to display the plot. Where you call this function within the UI functions will determine where the plot will appear within the layout of the app. Set the outputId argument of plotOutput() to a unique value.

  2. Provide plotOutput()’s click, dblclick, hover, and/or brush arguments with unique strings to control what happens when the user click, double-clicks, hovers, or brushes the plot. For example, click = "plot_click" will allow you to control what happens when the user clicks the plot by accessing input$plot_click in the server function.

  3. Within the server function, call renderPlot() and save its output as an element of the output list. Name the element after the outputId used above. For example, output$plot <- renderPlot(). plotOutput() will display the value of the output element whose name matches its outputId.

  4. Pass renderPlot() a block of code, surrounded with {}. The code should return a plot (e.g., a ggplot2 object).

Next, create another output that will display information after the user interacts with the plot.

  1. Add another output to the UI of your app (e.g., textOutput()). This output will display information after the user interacts with the plot. Provide this output with a unique outputId.

  2. Within the server function, use the corresponding render_() function (e.g., renderText()) and save its output as an element of the output list. Name the element after the outputId used above. For example, output$coords <- renderText().

Finally, connect the second output to the plot input.

  1. Pass the second render_() function (e.g., renderText()) a block of code, surrounded by {}. This code should use the plot inputs to display the relevant type of output. Access the plot inputs using the strings provided to plotOutput()’s click, dblclick, hover, and/or brush arguments (e.g., input$plot_click).

The server value of click, dblclick, and hover inputs are named lists with x and y elements indicating the mouse position. The server value of the brush input is a named list indicating the brush area (see the Plot brushing variation below for more details).

Variations

Find nearby points

Use the function nearPoints() to create a data frame containing rows near the click.

#| standalone: true
#| components: [viewer]
#| viewerHeight: 300

library(shiny)
library(bslib)
library(ggplot2)

ui <- page_fluid(
  layout_column_wrap(
    plotOutput("plot", click = "plot_click", height = "200px"), 
    tableOutput("data") 
  )
)

server <- function(input, output) {
  output$plot <- renderPlot({ 
    mpg |> 
      ggplot(aes(hwy, cty)) + 
      geom_point(size = 1) + 
      labs(title = "Click on a point on the plot")
  }) 

  output$data <- renderTable({ 
    nearPoints(mpg, input$plot_click) 
  }) 
}

shinyApp(ui, server)
library(shiny)
library(bslib)
library(ggplot2)

ui <- page_fluid(
  plotOutput("plot", click = "plot_click"), 
  tableOutput("data") 
)

server <- function(input, output) {
  output$plot <- renderPlot({ 
    mpg |> 
      ggplot(aes(hwy, cty)) + 
      geom_point() + 
      labs(title = "Click on a point on the plot")
  }) 

  output$data <- renderTable({ 
    nearPoints(mpg, input$plot_click) 
  }) 
}

shinyApp(ui, server)

Plot brushing

Pass a string to the brush argument of plotOutput() to allow the user to “brush” the plotting area. You can then use that string to access the server value of the brushed area (e.g., input$plot_brush), which will be a named list with xmin, xmax, ymin, and ymax elements indicating the brush area. Use the function brushedPoints() to access the rows from the data frame that fall within the brushed area.

#| standalone: true
#| components: [viewer]
#| viewerHeight: 300

library(shiny)
library(bslib)
library(ggplot2)

ui <- page_fluid(
  layout_column_wrap(
    plotOutput("plot", brush = "plot_brush", height = "200px"), 
    tableOutput("data") 
  )
)

server <- function(input, output) {
  output$plot <- renderPlot({ 
    mpg |> 
      ggplot(aes(hwy, cty)) + 
      geom_point(size = 1) + 
      labs(title = "Select an area on the plot")
  }) 

  output$data <- renderTable({ 
    brushedPoints(mpg, input$plot_brush) 
  }) 
}

shinyApp(ui, server)
library(shiny)
library(bslib)
library(ggplot2)

ui <- page_fluid(
  plotOutput("plot", brush = "plot_brush"), 
  tableOutput("data") 
)

server <- function(input, output) {
  output$plot <- renderPlot({ 
    mpg |> 
      ggplot(aes(hwy, cty)) + 
      geom_point() + 
      labs(title = "Select an area on the plot")
  }) 

  output$data <- renderTable({ 
    brushedPoints(mpg, input$plot_brush) 
  }) 
}

shinyApp(ui, server)
No matching items