File size: 2,081 Bytes
de2b30c
 
 
 
 
 
 
 
 
 
f868e0a
 
 
 
 
 
 
 
 
 
 
 
 
 
de2b30c
 
 
 
 
 
 
 
 
f868e0a
 
 
 
 
 
 
 
 
de2b30c
 
 
f868e0a
de2b30c
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
library(shiny)
library(bslib)
library(dplyr)
library(ggplot2)

df <- readr::read_csv("penguins.csv")
# Find subset of columns that are suitable for scatter plot
df_num <- df |> select(where(is.numeric), -Year)

ui <- page_fillable(theme = bs_theme(bootswatch = "minty"),
                    layout_sidebar(fillable = TRUE,
                                   sidebar = sidebar(
                                     varSelectInput("xvar", "X variable", df_num, selected = "Bill Length (mm)"),
                                     varSelectInput("yvar", "Y variable", df_num, selected = "Bill Depth (mm)"),
                                     checkboxGroupInput("species", "Filter by species",
                                                        choices = unique(df$Species), selected = unique(df$Species)
                                     ),
                                     hr(), # Add a horizontal rule
                                     checkboxInput("by_species", "Show species", TRUE),
                                     checkboxInput("show_margins", "Show marginal plots", TRUE),
                                     checkboxInput("smooth", "Add smoother"),
                                   ),
                                   plotOutput("scatter")
                    )
)

server <- function(input, output, session) {
  subsetted <- reactive({
    req(input$species)
    df |> filter(Species %in% input$species)
  })
  
  output$scatter <- renderPlot({
    p <- ggplot(subsetted(), aes(!!input$xvar, !!input$yvar)) +
      theme_bw() + 
      list(
        theme(legend.position = "bottom"),
        if (input$by_species) aes(color=Species),
        geom_point(),
        if (input$smooth) geom_smooth()
      )
    
    if (input$show_margins) {
      margin_type <- if (input$by_species) "density" else "histogram"
      p <- p |> ggExtra::ggMarginal(type = margin_type, margins = "both",
                                    size = 8, groupColour = input$by_species, groupFill = input$by_species)
    }
    
    p
  }, res = 100)
}

shinyApp(ui, server)