0

I am trying to have a white fill, for models where the p.fdr variable is <0.05.

However, the code I have written, is not modifying the correct point (the blue estimate should have a white fill not the pink estimate, as pictured below).

enter image description here

Example code:

conf.low <- sort(runif(6, min = 0, max = 1))
conf.high <- sort(runif(6, min = conf.low[1], max = 1))
estimate <- (conf.low + conf.high) / 2

forestplot <- data.frame(
outcome = c("mean_ssrt_0","mean_ssrt_0", "strp_scr_mnrt_congr", "strp_scr_mnrt_congr", "nihtbx_picvocab_theta_0","nihtbx_picvocab_theta_0"),
measure = c("Stop-Signal Task", "Stop-Signal Task","Emotional Word-Emotional Face Stroop", "Emotional Word-Emotional Face Stroop","NIH Toolbox® Cognition Battery", "NIH Toolbox® Cognition Battery" ),
a_model = c("1", "2", "1", "2", "1", "2"),
  conf.low = conf.low,
  conf.high = conf.high,
  estimate = estimate,
  p.fdr = runif(6, min = 0.05 / 1.3, max = 0.1))


forestplot$outcome <- factor(forestplot$outcome, levels=c('mean_ssrt_0', 'strp_scr_mnrt_congr', 'nihtbx_picvocab_theta_0'), 
                                                      labels=c("Mean SSRT", "RT", "PVT \n (Theta)"))
forestplot$measure <- factor(forestplot$measure, levels=c('Stop-Signal Task',
                                                              'Emotional Word-Emotional Face Stroop',
                                                              'NIH Toolbox® Cognition Battery'))
forestplot$a_model <- factor(forestplot$a_model , levels=c("1","2"))  
forestplot <- forestplot %>% arrange(measure, outcome,a_model, estimate, conf.low, conf.high)


plots <- forestplot %>% 
      split(.$measure) %>% 
      map2(.,names(.), ~ggplot(.x, aes(x = outcome, y =estimate, ymin =conf.low, ymax = conf.high,fill = as.factor(measure))) +
            geom_pointrange(aes(color=a_model, shape = a_model), size=0.5, position=position_dodge2(width=0.5, reverse = TRUE), show.legend = F)+ # add group
            geom_point(aes(shape = a_model), size=1.5, alpha = ifelse(.x$p.fdr < 0.05, 1, 0), position=position_dodge2(width=0.5, reverse = TRUE), show.legend = F, color="white") +
            geom_hline(yintercept = 0, linetype = 'dashed', col = 'black') +
            scale_y_continuous(limits = c(-0.1, 1))+
            coord_flip() +
            xlab('')+ 
            ylab(expression(atop("Est. mean change (in SD units with 95% CI)", paste("per 1 SD increase in gPFS"^"lowDA"))))+
            ggtitle(.y)+
            theme_minimal(base_size = 11)+ 
            guides(fill = "none")  +
            scale_color_manual(labels = c("Model 1", "Model 2"), values = c("#00B8E7", "#F8766D")) +
            labs(color="Model")+
            theme(panel.grid.major = element_blank(),
                   panel.grid.minor = element_blank(),
                   plot.title.position = "plot",
                   plot.title = element_text(size = 10,face="bold"), text = element_text(size = 10)))

    plot <-plot_grid(plots$`Stop-Signal Task`+  ggtitle(bquote(bold(~ "Stop-Signal Task" ~ '')))+ theme(legend.position = "none", axis.title.x = element_blank(), axis.ticks.x = element_blank(), axis.text.x = element_blank(),axis.line.y = element_line(color="black", size = 0.5)), 
                      plots$`Emotional Word-Emotional Face Stroop` +  ggtitle(bquote(bold(~ 'Stroop - EWEFS' ~ ''))) + theme(legend.position = "none", axis.title.x = element_blank(), axis.ticks.x = element_blank(), axis.text.x = element_blank(),axis.line.y = element_line(color="black", size = 0.5)),
                     plots$`NIH Toolbox® Cognition Battery` +  ggtitle(bquote(bold(~ "NIH Toolbox\U00AE" ~ ''))) + theme(legend.position = "none", axis.ticks.x = element_line(color="black", size = 0.5), axis.line.x = element_line(color="black", size = 0.5),axis.line.y = element_line(color="black", size = 0.5)),  
                      ncol = 1, nrow=3, rel_heights = c(1,1,1), align = 'v') # add 1 col and then the number of rows = to number of plots
  plot

I have tried arranging the ordering the original dataframe but, it doesn't solve the problem. forestplot <- forestplot %>% arrange(measure, outcome, a_model, estimate, conf.low, conf.high)

Harrison Jones
  • 2,256
  • 5
  • 27
  • 34

1 Answers1

0

Is it okay if instead of white fill, it's just transparent? You can control that through the shape argument. It also simplifies the code a little bit. This is how you would modify your plots object:

plots <- forestplot %>% 
  mutate(
    shape = if_else(a_model == 1 & p.fdr < 0.05, "hollow_circle", 
                    if_else(a_model == 1 & p.fdr >= 0.05, "filled_circle", 
                            if_else(a_model == 2 & p.fdr < 0.05, "hollow_triangle", "filled_triangle")))
  ) %>%
  split(.$measure) %>% 
  map2(.,names(.), ~ggplot(.x, aes(x = outcome, y = estimate, ymin = conf.low, ymax = conf.high, shape = shape, color = a_model)) +
         geom_pointrange(size = 0.5, position = position_dodge2(width = 0.5, reverse = TRUE), show.legend = F) + # add group
         geom_hline(yintercept = 0, linetype = 'dashed', col = 'black') +
         scale_y_continuous(limits = c(-0.1, 1)) +
         scale_shape_manual(values = c("filled_circle" = 16, "hollow_triangle" = 2, "hollow_circle" = 1, "filled_triangle" = 17)) +
         coord_flip() +
         xlab('')+ 
         ylab(expression(atop("Est. mean change (in SD units with 95% CI)", paste("per 1 SD increase in gPFS"^"lowDA"))))+
         ggtitle(.y)+
         theme_minimal(base_size = 11)+ 
         guides(fill = "none")  +
         scale_color_manual(values = c("1" = "#00B8E7", "2" = "#F8766D")) +
         theme(panel.grid.major = element_blank(),
               panel.grid.minor = element_blank(),
               plot.title.position = "plot",
               plot.title = element_text(size = 10,face="bold"), text = element_text(size = 10)))
Harrison Jones
  • 2,256
  • 5
  • 27
  • 34