Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

Using Plotly event data with a key on a ggplotly object

Offen
#2,325 1 Kommentar 2 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
25/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Veraltet
Tech-Stack
r

Rechercherichtung

Reproduzieren Sie das bereitgestellte R-Shiny-reprex mit Fokus auf den Aufruf von ggplotly und den Pfad des plotly_click-event_data. Als erledigt gilt dies, wenn ein in ggplot aes() definierter eindeutiger Schlüssel in den Ereignisdaten vorhanden ist und die Tabelle korrekt filtert; der Edit des Issues beschreibt einen funktionierenden Ansatz.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

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()
Vorherrschende Sprache
R
Sterne
2.7k
Forks
641
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus plotly/plotly.R

Alle Issues in plotly/plotly.R

Ähnliche Issues

Weitere Issues zu R

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.