2

I have a data frame which consist of multiple categories and month. Each row is 1 interaction by the participant so I want to show by the month and the different categories their interaction count throughout the year through a heatmap. A total of 4.9 million rows which means there is a total of 4.9million interactions throughout the year.

I tried to use an input to indicate the column name and tried to reactively change the X axis but it does not seem to work.

library(shiny)
library (igraph)
library (tidygraph)
library (ggraph)
library (plotly)

interaction <- readRDS("participant_interaction.rds")

# Define UI for application that draws a histogram
ui <- fluidPage(

    # Application title
    titlePanel("Social Network Interaction"),

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
        sidebarPanel(
          helpText(" Visualise the Social Network Interaction of the Population
          in Ohio"),
          
            selectInput(inputId = "Category",
                        label = "Choose a Category",
                        choices = c( "Household Size" = "Household_Size",
                                     "Have Kids" = "Have_Kids",
                                     "Education Level" = "Education_Level",
                                     "Interest Group" = "Interest_Group",
                                     "Age Group" = "Age_Group"
                        ),
                        selected = "Household_Size")
        ),

        # Show a plot of the generated distribution
        mainPanel(
           plotOutput("heatmapPlot")
        )
    )
)


server <- function(input, output, session) {
  
  dataset <- reactive({
    interaction %>%
      group_by(Month,input$Category)%>%
      summarise(InteractionCount = n()) %>%
      ungroup
  })

    output$heatmapPlot <- renderPlot({
      ggplot(dataset(),aes(x= input$Category,y = Month,fill = InteractionCount)) +
        geom_tile()
    })
}

# Run the application 
shinyApp(ui = ui, server = server)

Desired Output: Heatmap

Current Output: enter image description here

my random 20 (dput) for my RDS file:

structure(list(Participant_ID = c(374, 167, 899, 299, 443, 889, 
997, 521, 953, 436, 218, 422, 4, 227, 126, 12, 57, 386, 255, 
307), Month = structure(c(7L, 8L, 9L, 9L, 6L, 10L, 11L, 7L, 4L, 
6L, 10L, 11L, 8L, 12L, 7L, 8L, 7L, 11L, 7L, 10L), .Label = c("Jan", 
"Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", 
"Nov", "Dec"), class = c("ordered", "factor")), Income = c(37891.66, 
50156.67, 59877.49, 56393.02, 27899.58, 61258.05, 60728.21, 44858.08, 
36665.14, 27970.52, 27803.1, 63058.55, 135076.17, 46147.7, 30712.52, 
93774.11, 168620.22, 82925.21, 29451.88, 40328.79), Expenses = c(-26931.38, 
-32313.29, -25363.68, -23341.46, -24747.06, -18336.36, -17067.74, 
-22054.58, -23258.78, -22504.3, -23833.48, -17322.96, -28322.98, 
-16633.05, -23661.04, -21135.57, -20642.13, -23707.51, -26028.96, 
-30125.43), Household_Size = c(2, 2, 2, 3, 1, 2, 1, 3, 1, 1, 
1, 1, 3, 1, 2, 3, 3, 2, 3, 3), Have_Kids = c(FALSE, FALSE, FALSE, 
TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, 
TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, TRUE), Age = c(57, 
49, 59, 35, 56, 19, 48, 39, 45, 36, 38, 27, 43, 59, 26, 34, 56, 
39, 59, 38), Education_Level = c("High School or College", "High School or College", 
"Graduate", "High School or College", "High School or College", 
"Bachelors", "Graduate", "High School or College", "Graduate", 
"High School or College", "High School or College", "Graduate", 
"Bachelors", "High School or College", "High School or College", 
"High School or College", "Graduate", "Graduate", "High School or College", 
"Graduate"), Interest_Group = c("F", "F", "B", "I", "F", "A", 
"I", "I", "G", "J", "B", "D", "H", "H", "A", "D", "A", "H", "H", 
"H"), Joviality = c(0.85417223, 0.846680285, 0.544405537, 0.5149016, 
0.758121962, 0.126644557, 0.128853966, 0.477456741, 0.846871205, 
0.949412047, 0.971074532, 0.647441392, 0.857396691, 0.490213553, 
0.72895287, 0.241615182, 0.422849796, 0.479804894, 0.852187763, 
0.962210067), Age_Group = structure(c(9L, 7L, 9L, 4L, 9L, 1L, 
7L, 5L, 6L, 5L, 5L, 3L, 6L, 9L, 3L, 4L, 9L, 5L, 9L, 5L), .Label = c("20 & Below", 
"21-25", "26-30", "31-35", "36-40", "41-45", "46-50", "51-55", 
"56-60"), class = "factor")), row.names = c(1970773L, 932225L, 
4348108L, 1549925L, 2381951L, 4296595L, 4822673L, 2808545L, 4594431L, 
2337980L, 1146486L, 2241290L, 16905L, 1187579L, 697338L, 71056L, 
302316L, 2012670L, 1319716L, 1594018L), class = "data.frame")

1 Answer 1

2

input$Category is a string, however the dplyr verbs and aes expect a symbol. There are some older answers out there recommending aes_string or manually converting the string to a symbol.

However, now the recommended option is to use the .data pronoun, see the dplyr documentation and mastering shiny book.

In your case, it would be:

group_by(Month, .data[[input$Category]])

and

aes(x = .data[[input$Category]], y = Month, fill = InteractionCount)
Sign up to request clarification or add additional context in comments.

3 Comments

what's the logic behind .data[[input$Category]]
aes expects symbols (not strings) that can be directly evaluated with regards to the data, so you usually directly write the variable name of the corresponding column in your data.frame. However, the input$x variables are strings. .data allows to use these strings to be evaluated as a column name of your data. Have a look at the ggplot2 documentation or the above linked dplyr vignette for a more detailed explanation.
can you please look at this question? I adapted the Shiny plotting code based on your answer, thank you.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.