user13795242
user13795242

Reputation: 1

Comparing specific rows and whole rows in boxplot

I have a data frame ("Date", "A", "B"). I'm trying to use boxplot (by month) to analysis the data "A" for the row filtered by "B" and also for all the "A". I can only create two separate plots to do the boxplot for specific rows and for whole rows of data.

I tried two have 2 geom_boxplot under one ggplot(), but two boxplot just overlap with each other. Here is the code I used. Does anyone know how I can combime those two boxplot into one, so two boxplots will share same x axis, and each month in x axis will have two boxes.

ggplot() +
  geom_boxplot(data = df %>% filter(B == 1), 
               aes(x = Month, y = A, group=Month, fill = "Chamber_no fire"), outlier.shape = T) +
  geom_boxplot(data = df, aes(x = Month, y = A, group=Month, fill="Chamber"), outlier.shape = T) +
  theme_bw() +
  theme(panel.grid.major = element_blank()) +  
  scale_x_continuous(breaks=seq(2,12,1), minor_breaks = F) +
  geom_hline(yintercept = 0, linetype="dotted")
ggsave("sate_meas_O3_NOx_5km_nofire.png", width = 6, height = 4, units = "in")

enter image description here

Upvotes: 0

Views: 481

Answers (1)

stefan
stefan

Reputation: 124183

One approach to achieve your desired result is to

  1. Bind the filtered dataset and the total dataset by row and add an identifier id for each dataset which could easily be done via dplyr::bind_rows.

  2. Make a boxplot where you map id on the fill aesthetic and group by both id and Month using interaction

  3. Set the legend labels via scale_fill_discrete

As you provided no data I make use of a random example data set:

set.seed(42)

df <- data.frame(
  Month = sample(2:12, 100, rep = TRUE),
  A = rnorm(100),
  B = sample(1:2, 100, rep = TRUE)
)

library(ggplot2)
library(dplyr)

d <- bind_rows(list(b1 = df %>% filter(B == 1),
                    all = df), .id = "id")

ggplot(data = d, mapping = aes(x = Month, y = A, group=interaction(Month, id), fill = id)) +
  geom_boxplot(outlier.shape = T, position = "dodge") +
  scale_fill_discrete(labels = c(b1 = "Chamber_no fire", all = "Chamber")) +
  theme_bw() +
  theme(panel.grid.major = element_blank()) +  
  scale_x_continuous(breaks=seq(2,12,1), minor_breaks = F) +
  geom_hline(yintercept = 0, linetype="dotted")

Upvotes: 0

Related Questions