using shiny and plotly in r

10
Prepared by VOLKAN OBAN Reference: https://plot.ly/r/shiny-coupled-events/#serverr Coupled events with Shiny and Plotly in R An Example:

Upload: volkan-oban

Post on 09-Jan-2017

53 views

Category:

Data & Analytics


1 download

TRANSCRIPT

Page 1: Using Shiny and Plotly in R

Prepared by VOLKAN OBAN

Reference: https://plot.ly/r/shiny-coupled-events/#serverr

Coupled events with Shiny and Plotly in RAn Example:

Page 2: Using Shiny and Plotly in R
Page 3: Using Shiny and Plotly in R

Code:

ui.r

library(shiny)library(mlbench)library(plotly)library(shinythemes)library(dplyr)

# Load datadata(BreastCancer)

# Remove NAsBreastCancer <- na.omit(BreastCancer)

Page 4: Using Shiny and Plotly in R

# Remvove IDBreastCancer <- BreastCancer[,-1]

# Store features and actual class in seprate variablesfeatureList <- colnames(BreastCancer)[-10]class <- BreastCancer$Class

# Convert to numericBreastCancer[,1:9] <- apply(BreastCancer[,-10], 2, as.numeric)

# ui.R definitionui <- fluidPage( # Set theme theme = shinytheme("spacelab"),

# Some help text h2("Coupled events in plotly charts using Shiny"), h4("This Shiny app showcases coupled events using Plotly's ", tags$code("event_data()"), " function."), tags$ol( tags$li("The first chart showcases", tags$code("plotly_selected")), tags$li("The third chart showcases", tags$code("plotly_click")) ),

# Vertical space tags$hr(),

# Feature selection fixedRow( column(3, selectInput(inputId = "featureInput1", label = "Select first feature", choices = featureList, selected = "Cell.Size")),

Page 5: Using Shiny and Plotly in R

column(4, selectInput(inputId = "featureInput2", label = "Select second feature (observed event)", choices = featureList, selected = "Epith.c.size"))),

# First row fixedRow( column(6, plotlyOutput("Plot1", height = "600px")), column(6, plotlyOutput("Plot2", height = "600px"))),

tags$hr(), tags$blockquote("First drag a selection box in the scatter plot to populate the barchart. Then select one of the bars in the barchat to populate the boxplot"),

# Second row fixedRow( column(3, plotlyOutput("Plot3", height = "600px")), column(9, plotlyOutput("Plot4", height = "600px"))))

server.R

# server.R definitionserver <- function(input, output){

# Observes the second feature input for a change observeEvent(input$featureInput2,{

# Create a convenience data.frame which can be used for charting plot.df <- data.frame(BreastCancer[,input$featureInput1], BreastCancer[,input$featureInput2], Class = BreastCancer$Class)

# Add column names colnames(plot.df) <- c("x", "y", "Class")

Page 6: Using Shiny and Plotly in R

# Do a plotly contour plot to visualize the two featres with # the number of malignant cases as size # Note the use of 'source' argument output$Plot1 <- renderPlotly({ plot_ly(plot.df, x = x, y = y, mode = "markers", color = Class, source = "subset", marker = list(size = 30)) %>% layout(title = paste(input$featureInput1, "vs ", input$featureInput2), xaxis = list(title = input$featureInput1), yaxis = list(title = input$featureInput2), dragmode = "select", plot_bgcolor = "6A446F") })

# Create a contour plot of the number of malignant cases output$Plot2 <- renderPlotly({

plot.df %>% group_by(x, y, Class) %>% summarize(Count = n()) %>% filter(Class == "malignant") %>% plot_ly(x = x, y = y, z = Count, type = "contour") %>% layout(title = "Contour map of number of malignant cases", xaxis = list(title = input$featureInput1), yaxis = list(title = input$featureInput2))

})

# Assign to parent environment plot.df <<- plot.df

Page 7: Using Shiny and Plotly in R

})

# Coupled event 1 output$Plot3 <- renderPlotly({

# Get subset based on selection event.data <- event_data("plotly_selected", source = "subset")

# If NULL dont do anything if(is.null(event.data) == T) return(NULL)

# Get number of malignant and benign cases from selection malig.class <- subset(plot.df, Class == "malignant")[subset(event.data, curveNumber == 0)$pointNumber + 1,] benign.class <- subset(plot.df, Class == "benign")[subset(event.data, curveNumber == 1)$pointNumber + 1,]

# Combine plot.subset <- rbind(malig.class, benign.class)

# Summarize plot.summ <- plot.subset %>% group_by(x, y, Class) %>% summarize(Count = n())

# Assign to parent frame plot.summ <<- plot.summ

# Plot plot_ly(plot.summ, x = Class, y = Count, type = "bar", source = "select", color = Class) %>% layout(title = "No. of Malignant and Benign cases <br> in Selection",

Page 8: Using Shiny and Plotly in R

plot_bgcolor = "6A446F", yaxis = list(domain = c(0, 0.9))) })

# Coupled event 2 output$Plot4 <- renderPlotly({

# Get subset based on selection event.data <- event_data("plotly_click", source = "select")

# If NULL dont do anything if(is.null(event.data) == T) return(NULL)

# If Malignant if(event.data[3] == "malignant"){

tab <- subset(plot.summ, Class == "malignant")

p1 <- plot_ly(tab, x = x, y = Count, type = "box", showlegend = F) %>% layout(yaxis = list(title = "Count"), xaxis = list(title = input$featureInput1))

p2 <- plot_ly(tab, x = y, y = Count, type = "box", showlegend = F) %>% layout(title = "Box plot for Malignant cases", yaxis = list(title = "Count"), xaxis = list(title = input$featureInput2))

subplot(p1, p2) }else{ tab <- subset(plot.summ, Class == "benign")

Page 9: Using Shiny and Plotly in R

p1 <- plot_ly(tab, x = x, y = Count, type = "box", showlegend = F) %>% layout(yaxis = list(title = "Count"), xaxis = list(title = input$featureInput1))

p2 <- plot_ly(tab, x = y, y = Count, type = "box", showlegend = F) %>% layout(title = "Box plot for Benign cases", yaxis = list(title = "Count"), xaxis = list(title = input$featureInput2))

subplot(p1, p2) }

})

}