Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Grouped barplot side by side

Tags:

r

I'm trying to plot the table below using a grouped barplot with ggplot2.

How do I plot it in a way such that the scheduled audits and noofemails are plotted sided by side based on each day?

       Email Type Sent Month Sent Day Scheduled Audits Noofemails
27          A          1       30                7        581
29          A          1       31                0          9
1           A          2        1                2          8
26          B          1       29             1048      25312
28          B          1       30               23        170
30          B          1       31               18        109
2           B          2        1                6         93
3           B          2        2                9         86
4           B          2        4                3         21

ggplot(joined, aes(x=`Sent Day`, y=`Scheduled Audits`, fill = Noofemails )) + 
  geom_bar(stat="identity", position = position_dodge()) +
  scale_x_continuous(breaks = c(1:29)) + 
  ggtitle("Number of emails sent in February") + 
  theme_classic()

enter image description here Does not achieve the plot I hope to see.

like image 911
Javier Avatar asked Jun 27 '26 00:06

Javier


1 Answers

Using this data format, so slightly new column names, no more back-ticks. read_table(text = "") is a nice way to share little datasets on Stack

joined <- read.table(text =
   "ID  Email_Type Sent_Month Sent_Day Scheduled_Audits Noofemails
    27          A          1       30                7        581
    29          A          1       31                0          9
    1           A          2        1                2          8
    26          B          1       29             1048      25312
    28          B          1       30               23        170
    30          B          1       31               18        109
    2           B          2        1                6         93
    3           B          2        2                9         86
    4           B          2        4                3         21",
    header = TRUE)

This is why ggplot2 really likes long data instead of wide data. Because it needs column names to create the aesthetics.

So you can use the function tidyr::gather() to rearrange the two columns of interest into one with labels and one with values. This increase the number of rows in the data frame, so thats why its called long.

long <- tidyr::gather(joined,"key", "value", Scheduled_Audits, Noofemails)

ggplot(long, aes(Sent_Day, value, fill = key)) +
    geom_col(position = "dodge")

enter image description here

like image 76
Nate Avatar answered Jun 29 '26 17:06

Nate