skip to Main Content

I have a barplot made primarily in ggplot2. I want two vertical lines added and some text below the x-axis.

#Load data
d <- structure(list(author = structure(c(1L, 2L, 4L, 3L, 5L, 6L, 8L, 11L, 13L, 12L, 10L, 9L, 7L), .Label = c("Bahr et al", "Fuller et al", "Garbossa et al", "Gokhale et al", "Iuchi et al", "Lee et al", "Lee Y et all", "Merrel et al", "Newton et al", "Rossetti et al", "Usery et al", "Wychowski et al", "Zachenhofer et al"), class = "factor"), nAE = c(-22L, -34L, -158L, -90L, -70L, -41L, -48L, -32L, -73L, -23L, -25L, -13L, -46L), AE = c(3L, 1L, 7L, 1L, 3L, 10L, 3L, 6L, 3L, 5L, 4L, 6L, 5L), SAE = c(0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 2L, 0L, 0L)), .Names = c("author", "nAE", "AE", "SAE"), class = "data.frame", row.names = c(NA, -13L))

Code to my barplot:

library(dplyr)
library(tidyr)
library(ggplot2)

categories <- c("Adverse Effect", "No adverse effects", "Severe side effects")
cols <- c("#f6766d", "#01bfc4", "orange")


q <- d %>% 
gather(key, value, -author) %>% 
ggplot(aes(author, value, fill = key)) +
geom_col(alpha=0.9) + 
scale_x_discrete(name="Author") +
scale_y_continuous(name="Number of observations", limits=c(-160,15), 
seq(-160, 15, by=10)) +
theme_grey() +
theme(legend.position = "top") +
scale_fill_manual(labels = categories, values = cols) + 
labs(fill = "")

I have attached a picture below of how I want my barplot to look like. As you can see, I have added two vertical lines (at random position) and three texts (in photoshop).

enter image description here

Thanks in advance,
C.

2

Answers


  1. Will gridExtra package be of any help? It should deliver something close enough. You can combine 3 plots into 1 using method arrangeGrob or grid.arrange.

    https://cran.r-project.org/web/packages/gridExtra/index.html

    Login or Signup to reply.
  2. The vertical lines are no problem at all. Simply use:

      +
      geom_vline(xintercept= 3.5, colour = "red") + 
      geom_vline(xintercept= 10.5, colour = "red")
    

    The values 3.5 and 10.5 mean that the lines intercept the x-axis between the third and fourth and respective between the tenth and eleventh author.

    Adding text outside the plot is a whole different beast though. The “cleanest” way I could think of is adding the text inside the plot:

    y <- min(d$nAE) + 10
    textaes <- data.frame(y = c(y, y, y),
                          x = c(2, 7, 12),
                          lab = c("Text1", "Text2", "Text3"))
    q <- d %>% 
      gather(key, value, -author) %>% 
      ggplot(aes(x=author, y=value, fill = key)) +
      geom_col(alpha=0.9) + 
      scale_x_discrete(name="Author") +
      scale_y_continuous(name="Number of observations", limits=c(-160,15), 
                         seq(-160, 15, by=10), expand = c(0.15, 0.05)) +
      theme_grey() +
      theme(legend.position = "top",
            axis.text.x = element_text(angle = 90, hjust = 1)) +
      scale_fill_manual(labels = categories, values = cols) + 
      labs(fill = "") +
      geom_vline(xintercept= 3.5, colour = "red") + 
      geom_vline(xintercept= 10.5, colour = "red") +
      geom_text(mapping = aes(y = y, x = x, label = lab), 
                data = textaes, inherit.aes = FALSE)
    q
    

    enter image description here

    EDIT: Just found a relatively easy way to add text outside the plot here. But I don’t think it’s a very nice solution:

    q <- d %>% 
      gather(key, value, -author) %>% 
      ggplot(aes(x=author, y=value, fill = key)) +
      geom_col(alpha=0.9) + 
      scale_x_discrete(name="Author") +
      scale_y_continuous(name="Number of observations", limits=c(-160,15), 
                         seq(-160, 15, by=10), expand = c(0.15, 0.05)) +
      theme_grey() +
      theme(legend.position = "top",
            axis.text.x = element_text(angle = 90, hjust = 1)) +
      scale_fill_manual(labels = categories, values = cols) + 
      labs(fill = "") +
      geom_vline(xintercept= 3.5, colour = "red") + 
      geom_vline(xintercept= 10.5, colour = "red")
    q
    
    library(grid)
    q
    grid.text("Text1", x = unit(0.15, "npc"), y = unit(0.1, "npc"), gp=gpar(col="red"))
    grid.text("Text2", x = unit(0.5, "npc"), y = unit(0.1, "npc"), gp=gpar(col="red"))
    grid.text("Text3", x = unit(0.85, "npc"), y = unit(0.1, "npc"), gp=gpar(col="red"))
    

    enter image description here

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search