'Is there a way to open a dataset when I click on a section in pie chart?

I want to create a pie chart and when I click on a section I should get a dataframe displayed. For example I might create the following pie chart:

# Create data for the graph.
x <- c(21, 62, 10, 53)
labels <- c("London", "New York", "Singapore", "Mumbai")

# Give the chart file a name.
png(file = "city.png")

# Plot the chart.
pie(x,labels)

enter image description here

Now lets say when I click on a slice such as 'london' I get the IRIS datset.

Solution i used:

library(shiny)
library(plotly)

df <- https://drive.google.com/file/d/1RT5AkCef4cehEaGelK0avbXAtck1f-Ap/view   #READ THIS DATA HERE
setDT(df)
dtnum <- df[ , .N, by="V3"]
dtnum2 <- df[ , .N, by="V2"]
ui <- fluidPage(
  
  plotlyOutput("myPlot"),
  plotlyOutput("myPlot2"),
  DTOutput("mydt")
  
)

server <- function(input, output, session) {
  
  observe({
    d <- event_data("plotly_click")
    print(d)
    if (is.null(d)) {
      df
    } else {
      output$mydt <- renderDT({
        df[V3 == d$customdata]
      })
    }
  })
  output$myPlot2 <- renderPlotly({
    plot_ly(dtnum2, labels = ~V2, values = ~N, type = 'pie', customdata = ~V2)
  }) 
  
  output$myPlot <- renderPlotly({
    plot_ly(dtnum, labels = ~V3, values = ~N, type = 'pie', customdata = ~V3)
  })
  
}

shinyApp(ui, server)


Solution 1:[1]

Here is an example using shiny, plotly and DT.

To understand what's going on please check the plotly book on linking views with shiny and supplying custom data.

library(data.table)
library(plotly)
library(DT)
library(datasets)
library(shiny)

irisDT <- copy(iris)
setDT(irisDT)

ui <- fluidPage(
  plotlyOutput("myPlot"),
  DT::dataTableOutput("myTable")
)

server <- function(input, output, session) {
  output$myPlot <- renderPlotly({
    irisCountDT <- irisDT[,.N, by="Species"]
    fig <- plot_ly(irisCountDT, labels = ~Species, values = ~N, type = 'pie', source = "myPlotSource", customdata = ~Species)
  })
  
  myPlotEventData <- reactive({
    event_data(
      event = "plotly_click",
      source = "myPlotSource")
    })
  
  output$myTable <- DT::renderDataTable({
    datatable(irisDT[Species %in% myPlotEventData()$customdata[[1]]])
  })
}

shinyApp(ui, server)

result

Also check plotly's capabilities regarding crosstalk in this context.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 ismirsehregal