0

I have two plots using data from two separate datasets (males vs females), which I have arranged side by side using ggarrange(). Males are shown by filled circles, females by unfilled circles.

How can I add a legend so that the reader may understand which graph is from male data, and which graph is from female data?

Here is my code:


Pronotum_Width_Female <- c("6.5", "7.4", "7.0","6.2", "6.3", "6.3","6.0", "6.4", "6.9","6.6", "6.8", "7.2")

Year_Female <- c("1995", "1999", "2001","2003", "2005", "2007","2008", "2009", "2010","2011", "2012", "2013")

female <- data.frame(Pronotum_Width_Female, Year_Female)

Pronotum_Width_Male <- c("6.4", "5.9", "5.8","6.2", "6.5", "6.0","6.2", "5.7", "5.8","6.0", "6.1", "6.5")

Year_Male <- c("1995", "1999", "2001","2003", "2005", "2007","2008", "2009", "2010","2011", "2012", "2013")

male <- data.frame(Pronotum_Width_Male, Year_Male)

plot1 <- ggplot(female, aes(y=Pronotum_Width_Female,x=Year_Female)) + 
  geom_point(size = 2, shape = 1) + 
  labs(x="Year", y = "Pronotum Width (mm)") + 
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  theme(axis.title = element_text(size=15), # for axix
        title = element_text(size=15),axis.text = element_text(size=15),
        axis.title.x = element_text(vjust = 0),
        axis.title.y = element_text(vjust = 2), 
        legend.title = element_text(vjust = 0.5))+
  coord_cartesian(ylim=c(5,12))


plot2 <- ggplot(male, aes(y=Pronotum_Width_Male,x=Year_Male)) + 
  geom_point(size = 2) + 
  geom_smooth(method = "lm", se = TRUE,col="black",size=1) +
  labs(x="Year", y = "Pronotum Width (mm)") + 
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black")) +
  theme(axis.title = element_text(size=15), # for axix
        title = element_text(size=15),axis.text = element_text(size=15),
        axis.title.x = element_text(vjust = 0),
        axis.title.y = element_text(vjust = 2), 
        legend.title = element_text(vjust = 0.5))+
  coord_cartesian(ylim=c(5,12))

ggarrange(plot2, plot1,
          labels = c("a)", "b)"),
          ncol = 2, nrow = 1)
  • it is advisable to post a fully reproducible example https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example (also, it looks like the first part of your code has been left out) – desval Nov 03 '20 at 08:59
  • Apologies, I've added data now. – Lizzie Yarwood Nov 03 '20 at 09:29

1 Answers1

0

Not sure what you are trying to achieve but in my opinion the most simple approach would be to bind your data together, make one plot and facet by gender which will give you nice labels for the panels:

Pronotum_Width_Female <- c("6.5", "7.4", "7.0","6.2", "6.3", "6.3","6.0", "6.4", "6.9","6.6", "6.8", "7.2")
Year_Female <- c("1995", "1999", "2001","2003", "2005", "2007","2008", "2009", "2010","2011", "2012", "2013")
Female <- data.frame(Pronotum_Width = Pronotum_Width_Female, Year = Year_Female)

Pronotum_Width_Male <- c("6.4", "5.9", "5.8","6.2", "6.5", "6.0","6.2", "5.7", "5.8","6.0", "6.1", "6.5")
Year_Male <- c("1995", "1999", "2001","2003", "2005", "2007","2008", "2009", "2010","2011", "2012", "2013")
Male <- data.frame(Pronotum_Width = Pronotum_Width_Male, Year = Year_Male)

library(ggplot2)
library(dplyr)

d <- dplyr::bind_rows(list(Female = Female, Male = Male), .id = "gender") %>% 
  # Make Pronotum_Width numeric
  mutate(Pronotum_Width = as.numeric(Pronotum_Width))

ggplot(d, aes(y=Pronotum_Width, x = Year)) + 
  geom_point(aes(shape = gender), size = 2) + 
  scale_shape_manual(values = c(Female = 1, Male = 16)) +
  labs(x="Year", y = "Pronotum Width (mm)") + 
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_rect(fill = NA), 
        axis.line = element_line(colour = "black")) +
  theme(axis.title = element_text(size=15), # for axix
        title = element_text(size=15),
        axis.text = element_text(size=15),
        axis.title.x = element_text(vjust = 0),
        axis.title.y = element_text(vjust = 2), 
        legend.title = element_text(vjust = 0.5),
        strip.background.x = element_rect(fill = NA)) +
  coord_cartesian(ylim = c(5, 12)) +
  facet_wrap(~gender) +
  # Drop the legend
  guides(shape = FALSE)

stefan
  • 90,330
  • 6
  • 25
  • 51