Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Using Plotly event data with a key on a ggplotly object

Aperta
#2,325 1 commento 2 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
25/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Ferma
Stack tecnologico
r

Direzione di ricerca

Riprodurre il reprex R Shiny fornito, concentrandosi sulla chiamata a ggplotly e sul percorso event_data di plotly_click. Il lavoro è completato quando una chiave univoca definita in ggplot aes() è presente nei dati dell’evento e filtra correttamente la tabella; la modifica dell’issue riporta un approccio funzionante.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

I am using Plotly in an R Shiny dashboard with event data so a user can click on a visualization and the linked table will filter to show just that data observation. In the reprex below, I have a plot made in ggplot that I converted to a Plotly object using ggplotly. This works fine, but when identifying observations using pointNumber in the event data, it misidentifies the observation that was clicked on because the plot and the table have different numbers of observations.

Because of this, I'm trying to identify observations using a "key" argument, but no matter how I define the key, it does not appear as a column in the event data. When this plot is made using Plotly to begin with, eliminating ggplot entirely, it works fine and the key column does appear. However, the visualization I need to use is a phylogenetic tree that has proven impossible to visualize in Plotly, which is why I started it off in ggplot. I have searched extensively, but I can't find a way to make event data work with a key using a ggplot -> plotly object. Is there a way to make this work?

### Load data
data(mtcars)
mtcars$index <- c(1:32)
data <- mtcars


# Define UI
ui <- fluidPage(
  titlePanel("Dashboard"),
  tags$style('.container-fluid {
                             background-color: #e3f2fd;
              }'),
  fluidRow(
    
    column(6,
           h3("Scatterplot"),
           plotlyOutput("phylo_tree")),
    
    # Metadata
    column(12, h3("Metadata")),
    column(12, DT::dataTableOutput("data_table"))
    
  )
)

# Define server logic
server <- function(input, output) {
  
  
  output$phylo_tree <- renderPlotly({
    
    # Create a scatterplot using ggplot2
    scatterplot <- ggplot(mtcars, aes(x = mpg, y = hp, label = rownames(mtcars))) +
      geom_point() +
      geom_text(nudge_y = 5, nudge_x = 1, check_overlap = TRUE) +
      labs(title = "Scatterplot of mtcars Dataset",
           x = "Miles Per Gallon (mpg)",
           y = "Horsepower (hp)") +
      theme_minimal()
    
    scatterplot <- plotly::ggplotly(scatterplot, tooltip = "text", 
                                   source = "source1", key = ~index)
    
    # Collect data when a user clicks on a point
    event_register(scatterplot, event = "plotly_selected")
    
    
    scatterplot
  })
  
  
  output$data_table <- DT::renderDataTable({
    
    # Use click event data
    click_data <- event_data("plotly_click", source = "source1")
    
    observe({
      print(event_data("plotly_click", source = "source1"))
    })
    
    # Check if any points are clicked
    if (!is.null(click_data)) {
      # Filter data based on the clicked point
      data <- data[data$index %in% click_data$key,]

    }
    
    datatable(data, 
              rownames = FALSE, 
              filter = "top",
              extensions = "Buttons",  # Add download buttons
              options = list(scrollX = TRUE, dom = "Bfrtip", 
                             buttons = c("csv", "excel", "pdf"),
                             lengthMenu = list(c(10,25,50,-1),
                                               c(10,25,50,"All"))),
              selection = list(mode = "multiple", target = "row")) %>%
      formatStyle(names(data),lineHeight='80%') 
  })
  
  
}


Edit: I solved my own problem. The key needs to be specified in the aes() argument of the ggplot code. The following ggplot code should work with the above datatable code. Note that the id variable specified here should be some unique key identifier.

# Create a scatterplot using ggplot2
    scatterplot <- ggplot(mtcars, aes(x = mpg, y = hp, label = rownames(mtcars), key = id)) +
      geom_point() +
      geom_text(nudge_y = 5, nudge_x = 1, check_overlap = TRUE) +
      labs(title = "Scatterplot of mtcars Dataset",
           x = "Miles Per Gallon (mpg)",
           y = "Horsepower (hp)") +
      theme_minimal()
Lingua principale
R
Stelle
2.7k
Fork
641
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di plotly/plotly.R

Tutte le issue di plotly/plotly.R

Issue simili

Altre issue su R

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.