plotly.R icon indicating copy to clipboard operation
plotly.R copied to clipboard

sunburst - child level not showing until click

Open dhunt81 opened this issue 7 months ago • 0 comments

I have a sunburst plot with four levels. I'm finding that when zoomed out the most, showing all levels, the fourth level of two groups are not displaying until I zoom in on that specific group. Clicking on the group shows the children appropriately. The children of one group is displaying correctly however. See the video for a demonstration and a reproducible set of code below.

https://github.com/user-attachments/assets/62a3b3de-1adb-4727-85c2-d976c50f8d46

library("pharmaverseadam")
library("pharmaversesdtm")
library("dplyr")
library("plotly")

#Consenting 
      level_1 <- pharmaverseadam::adsl %>%
        mutate(order=1,level_1 = case_when(
          !is.na(RFICDTC) ~ "Consented",
          is.na(RFICDTC) ~ "Not Consented")
          ) %>%
        select(USUBJID, level_1)
      
      #level 2
      level_2_sf <- pharmaversesdtm::ds %>%
        filter(DSCAT == "DISPOSITION EVENT" & DSDECOD == "SCREEN FAILURE") %>%
        group_by(USUBJID) %>%
        slice_head(n=1) %>%
        ungroup() %>%
        mutate(level_2 = "Screen Failure") %>%
        select(USUBJID, level_2)
      
      level_2_rand <- pharmaversesdtm::ds %>%
        filter(DSCAT == "PROTOCOL MILESTONE" & DSDECOD == "RANDOMIZED") %>%
        group_by(USUBJID) %>%
        slice_head(n=1) %>%
        ungroup() %>%
        mutate(level_2 = "Randomized/Enrolled") %>%
        select(USUBJID, level_2)
      
      level_2 <- rbind(level_2_sf, level_2_rand)
      
      
      #Level 3
      
      level_3_arm <- pharmaverseadam::adsl %>%
        filter(toupper(ARM) != "SCREEN FAILURE") %>%
        mutate(level_3 = ARM) %>%
        select(USUBJID, level_3)
      
      level_3 <- rbind(level_3_arm)
      
      
      #Level 4
      
      level_4_ds <- pharmaversesdtm::ds %>%
     
        filter(DSCAT == "DISPOSITION EVENT" & DSDECOD != "SCREEN FAILURE") %>%
        mutate(level_4 = DSDECOD) %>%
        select(USUBJID, level_4)
                
      level_4 <- bind_rows(level_4_ds)
            
      # FINAL DATA (merge all levels)
      
      levels_all <- full_join(level_1, level_2, by = c("USUBJID") ) %>%
        full_join(level_3, by=c("USUBJID")) %>%
        full_join(level_4, by=c("USUBJID")) %>%
        group_by(level_1, level_2, level_3, level_4) %>%
        summarise(values = n()) %>%
        ungroup()
      
      level1_grps <- unique(levels_all$level_1)
      level2_grps <- unique(levels_all$level_2)
      level3_grps <- unique(levels_all$level_3)
      level4_grps <- unique(levels_all$level_4)
      
      levels_all$ord1 <- sprintf('%02d', match(levels_all$level_1, level1_grps))
      levels_all$ord2 <- sprintf('%02d', match(levels_all$level_2, level2_grps))
      levels_all$ord3 <- sprintf('%02d', match(levels_all$level_3, level3_grps))
      levels_all$ord4 <- sprintf('%02d', match(levels_all$level_4, level4_grps))
      
      levels_all <- levels_all %>%
        mutate(order_by = paste(ord1,ord2,ord3,ord4, sep="."))
      

      level_1_sum <- levels_all %>%
        mutate(id = substr(order_by, 1, 2)  ) %>%
        group_by(level_1, id) %>%
        summarize(n = sum(values) ) %>%
        mutate(parents=NA, labels=level_1, values=n) %>%
        select(parents, labels, values, id) %>%
        ungroup()
      
      level_2_sum <- levels_all %>%
        mutate(id = substr(order_by, 1, 5)  ) %>%
        group_by(level_1, level_2, id) %>%
        summarize(n = sum(values) ) %>%
        mutate(parents=level_1, labels=level_2, values=n) %>%
        select(id, parents, labels, values) %>%
        ungroup()
      
      level_3_sum <- levels_all %>%
        mutate(id = substr(order_by, 1, 8)  ) %>%
        group_by(level_2, level_3, id) %>%
        summarize(n = sum(values) ) %>%
        mutate(parents=level_2, labels=level_3, values=n) %>%
        select(id, parents, labels, values) %>%
        ungroup()
     
      level_4_sum <- levels_all %>%
        mutate(id = substr(order_by, 1, 11)  ) %>%
        group_by(level_3, level_4, id) %>%
        summarize(n = sum(values) ) %>%
        mutate(parents=level_3, labels=level_4, values=n) %>%
        select(id, parents, labels, values) %>%
        ungroup()
           
      levels_all_sum <- bind_rows( level_1_sum, level_2_sum, level_3_sum, level_4_sum) %>%
        filter(!is.na(parents) & !is.na(labels))
 
      plot_ly(data=levels_all_sum, type='sunburst', parents= ~parents, labels= ~labels, values= ~values, branchvalues = 'total')

dhunt81 avatar May 31 '25 13:05 dhunt81