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)

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)
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)

Also check plotly's capabilities regarding crosstalk in this context.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With