Home > Software engineering >  Editing legend in ggplot2 - R
Editing legend in ggplot2 - R

Time:01-26

I'm learning to use ggplot to make graphs for my research and I'm having some trouble setting legends for them.

Initially I thought about just using the aes() function inside geom_point and geom_line to get the aesthetics I'm looking for. However, I realized the legends weren't being generated by doing it this way. Code and exemple below.

#Stablish the variables as vectors

MexxJan_hydrogen <- c(0, 1.38, 3.19, 8.30)
MexyJan_hydrogen <- c(0, 1.25, 2.78, 6.23)
MexzJan_hydrogen <- c(0, 2.46, 5.68, 12.18)
MexwJan_hydrogen <- c(0, 7.56, 9.20, 10.19)
time_hydrogen <- c(0, 60, 120, 180)

#Create the data frame
hydrogen_data <- data.frame(time_hydrogen, MexxJan_hydrogen, MexyJan_hydrogen, MexzJan_hydrogen, MexwJan_hydrogen)
view(hydrogen_data)

#Code the plot
hydrogen_plot <- ggplot(data = hydrogen_data)  
  geom_line(aes(x = time_hydrogen, y = MexxJan_hydrogen), color = "palegreen3", lwd = 1)  
  geom_line(aes(x = time_hydrogen, y = MexyJan_hydrogen), color = "tan1", lwd = 1)  
  geom_line(aes(x = time_hydrogen, y = MexzJan_hydrogen), color = "tomato2", lwd = 1)  
  geom_line(aes(x = time_hydrogen, y = MexwJan_hydrogen), color = "cadetblue", lwd = 1)  
  geom_point(aes(x = time_hydrogen, y = MexxJan_hydrogen), color = "palegreen3", shape = 15, size = 5)  
  geom_point(aes(x = time_hydrogen, y = MexyJan_hydrogen), color = "tan1", shape = 16, size = 5)  
  geom_point(aes(x = time_hydrogen, y = MexzJan_hydrogen), color = "tomato2", shape = 17, size = 5)  
  geom_point(aes(x = time_hydrogen, y = MexwJan_hydrogen), color = "cadetblue", shape = 18, size = 5)  
  theme_bw()  
  theme(axis.text = element_text(family = "Arial", size = 15, color = "black"),
        axis.title.x = element_text(family = "Arial", size = 16, margin = margin(t = 15)),
        axis.title.y = element_text(family = "Arial", size = 16, margin = margin(r = 15)),axis.line = element_line(color = "black"),
        plot.background = element_rect(fill = "transparent", color = NA),
        panel.border = element_rect(color = "black"),
        panel.background = element_rect(fill = "transparent"),
        panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.y = element_blank(),
        panel.grid.minor.y = element_blank(),
        axis.ticks.length = unit(0.20, units = "cm"),
        legend.background = element_rect(fill = "transparent"),
        legend.key = element_rect(fill = "transparent", colour = NA),
        legend.position = "top",
        legend.key.width = unit(0, unit = "cm"),
        legend.key.height = unit(0, unit = "cm"),
        legend.title = element_blank(),
        legend.text = element_text(size = 13.5),
        legend.spacing.x = unit(0.1, "cm"),
        legend.text.align = unit(0.05, unit = "cm"))  
  labs(x = "Time (min)", y = "Gas Evolution (µmol.g"^-1~")")  
  coord_cartesian(ylim = c(0,15), xlim = c(0,180))  
  scale_y_continuous(expand = expansion(mult = c(0.02, 0.02)),
                     n.breaks = 5)  
  scale_x_continuous(expand = expansion(mult = c(0.02, 0.02)),
                     breaks = c(0, 60, 120, 180))

enter image description here

I then found that I could use the function scale_colors_manual to get the desired colors and show the legend. Also, using scale_colors_manual I managed to change the legend text to a shorter option. Code and exemple below.

#Stablish the variables as vectors

MexxJan_hydrogen <- c(0, 1.38, 3.19, 8.30)
MexyJan_hydrogen <- c(0, 1.25, 2.78, 6.23)
MexzJan_hydrogen <- c(0, 2.46, 5.68, 12.18)
MexwJan_hydrogen <- c(0, 7.56, 9.20, 10.19)
time_hydrogen <- c(0, 60, 120, 180)

#Create the data frame
hydrogen_data <- data.frame(time_hydrogen, MexxJan_hydrogen, MexyJan_hydrogen, MexzJan_hydrogen, MexwJan_hydrogen)
view(hydrogen_data)

hydrogen_plot <- ggplot(data = hydrogen_data)  
  geom_line(aes(x = time_hydrogen, y = MexxJan_hydrogen, color = "MexxJan_hydrogen"), lwd = 1)  
  geom_line(aes(x = time_hydrogen, y = MexyJan_hydrogen, color = "MexyJan_hydrogen"), lwd = 1)  
  geom_line(aes(x = time_hydrogen, y = MexzJan_hydrogen, color = "MexzJan_hydrogen"), lwd = 1)  
  geom_line(aes(x = time_hydrogen, y = MexwJan_hydrogen, color = "MexwJan_hydrogen"), lwd = 1)  
  geom_point(aes(x = time_hydrogen, y = MexxJan_hydrogen, color = "MexxJan_hydrogen"), shape = 15, size = 5)  
  geom_point(aes(x = time_hydrogen, y = MexyJan_hydrogen, color = "MexyJan_hydrogen"), shape = 16, size = 5)  
  geom_point(aes(x = time_hydrogen, y = MexzJan_hydrogen, color = "MexzJan_hydrogen"), shape = 17, size = 5)  
  geom_point(aes(x = time_hydrogen, y = MexwJan_hydrogen, color = "MexwJan_hydrogen"), shape = 18, size = 5)  
  theme_bw()  
  theme(axis.text = element_text(family = "Arial", size = 15, color = "black"),
        axis.title.x = element_text(family = "Arial", size = 16, margin = margin(t = 15)),
        axis.title.y = element_text(family = "Arial", size = 16, margin = margin(r = 15)),axis.line = element_line(color = "black"),
        plot.background = element_rect(fill = "transparent", color = NA),
        panel.border = element_rect(color = "black"),
        panel.background = element_rect(fill = "transparent"),
        panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank(),
        panel.grid.major.y = element_blank(),
        panel.grid.minor.y = element_blank(),
        axis.ticks.length = unit(0.20, units = "cm"),
        legend.background = element_rect(fill = "transparent"),
        legend.key = element_rect(fill = "transparent", colour = NA),
        legend.position = "top",
        legend.key.width = unit(0, unit = "cm"),
        legend.key.height = unit(0, unit = "cm"),
        legend.title = element_blank(),
        legend.text = element_text(size = 13.5),
        legend.spacing.x = unit(0.1, "cm"),
        legend.text.align = unit(0.05, unit = "cm"))  
  labs(x = "Time (min)", y = "Gas Evolution (µmol.g"^-1~")")  
  coord_cartesian(ylim = c(0,15), xlim = c(0,180))   #Limit the size of the plot
  scale_y_continuous(expand = expansion(mult = c(0.02, 0.02)),
                     n.breaks = 5)  
  scale_x_continuous(expand = expansion(mult = c(0.02, 0.02)),
                     breaks = c(0, 60, 120, 180))  
  scale_color_manual(labels = c("15Me-NT", "15Me-nNT", "15Me-NNT", "15Me-nnt"),
                     values = c("MexxJan_hydrogen" = "palegreen3", "MexyJan_hydrogen" = "tan1", "MexzJan_hydrogen" = "cadetblue", "MexwJan_hydrogen" = "tomato2"))

enter image description here

In this case, I got the colors and the legend. However, as you can see in the image, the legend keys look like a bunch of geometric forms stacked. I couldn't find a way to solve this. Tried using scale_shape_manual but I couldn't get the code right.

May you help me getting this plot some beautiful aesthetics? hehehe

Thank you. Stay safe.

CodePudding user response:

To fix your issue you have to move shape inside aes similar to what you have done for color and afterwards set your shapes via scale_shape_manual. However, you could simplify your approach considerably by first reshaping your data to long or tidy data format. Doing so allows to add your lines and points which just one geom_point and geom_line:

library(tidyr)
library(ggplot2)

hydrogen_data_long <- hydrogen_data %>%
  tidyr::pivot_longer(-time_hydrogen, names_to = "hydrogren")

ggplot(hydrogen_data_long, aes(x = time_hydrogen, y = value, color = hydrogren))  
  geom_line(lwd = 1)  
  geom_point(aes(shape = hydrogren), size = 5)  
  scale_shape_manual(
    labels = c("15Me-NT", "15Me-nNT", "15Me-NNT", "15Me-nnt"),
    values = c(
      "MexxJan_hydrogen" = 15, "MexyJan_hydrogen" = 16,
      "MexzJan_hydrogen" = 17, "MexwJan_hydrogen" = 18
    )
  )  
  scale_color_manual(
    labels = c("15Me-NT", "15Me-nNT", "15Me-NNT", "15Me-nnt"),
    values = c(
      "MexxJan_hydrogen" = "palegreen3", "MexyJan_hydrogen" = "tan1",
      "MexzJan_hydrogen" = "cadetblue", "MexwJan_hydrogen" = "tomato2"
    )
  )  
  theme_bw()  
  theme(
    axis.text = element_text(family = "Arial", size = 15, color = "black"),
    axis.title.x = element_text(family = "Arial", size = 16, margin = margin(t = 15)),
    axis.title.y = element_text(family = "Arial", size = 16, margin = margin(r = 15)), 
    axis.line = element_line(color = "black"),
    plot.background = element_rect(fill = "transparent", color = NA),
    panel.border = element_rect(color = "black"),
    panel.background = element_rect(fill = "transparent"),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    axis.ticks.length = unit(0.20, units = "cm"),
    legend.background = element_rect(fill = "transparent"),
    legend.key = element_rect(fill = "transparent", colour = NA),
    legend.position = "top",
    legend.key.width = unit(0, unit = "cm"),
    legend.key.height = unit(0, unit = "cm"),
    legend.title = element_blank(),
    legend.text = element_text(size = 13.5),
    legend.spacing.x = unit(0.1, "cm"),
    legend.text.align = unit(0.05, unit = "cm")
  )  
  labs(x = "Time (min)", y = "Gas Evolution (µmol.g"^-1 ~ ")")  
  coord_cartesian(ylim = c(0, 15), xlim = c(0, 180))   # Limit the size of the plot
  scale_y_continuous(
    expand = expansion(mult = c(0.02, 0.02)),
    n.breaks = 5
  )  
  scale_x_continuous(
    expand = expansion(mult = c(0.02, 0.02)),
    breaks = c(0, 60, 120, 180)
  )

enter image description here

CodePudding user response:

You are making life harder for yourself by passing your data frame in the wrong format. If you pivot to long format, you only need a single geom_line and geom_point. It's also far easier to map your colors and shapes, which will automatically appear in the legend.

Also, try to choose a default theme that's closer to the look you want to achieve to cut down on the number of tweaks you have to make via theme. One of the key things you'll learn in R, as in other languages, is that cutting down code to a minimum makes it easier to change or debug your code later on.

library(tidyverse)

hydrogen_data %>%
  pivot_longer(-time_hydrogen) %>%
  ggplot(aes(time_hydrogen, value, color = name, shape = name))  
  geom_line(lwd = 1)  
  geom_point(size = 5)  
  scale_color_manual(values = c("tomato2",  "palegreen", "tan1", "cadetblue"),
                     labels = paste0("15Me-", c("NT", "nNT", "NNT", "nnt")))  
  scale_shape_manual(values = c(18, 15, 16, 17),
                     labels = paste0("15Me-", c("NT", "nNT", "NNT", "nnt")))  
  scale_y_continuous(expression(Gas~Evolution~(µmol.g^-1)),
                     expand = expansion(mult = c(0.02, 0.02)), n.breaks = 5)  
  scale_x_continuous("Time (min)", expand = expansion(mult = c(0.02, 0.02)),
                     breaks = c(0, 60, 120, 180))  
  theme_classic(base_size = 16)  
  theme(axis.text = element_text(family = "Arial", size = 15, color = "black"),
        plot.background = element_blank(),
        panel.border = element_rect(color = "black", fill = NA),
        panel.background = element_blank(),
        axis.ticks.length = unit(0.20, units = "cm"),
        legend.background = element_blank(), 
        legend.position = "top",
        legend.title = element_blank())  
  coord_cartesian(ylim = c(0, 15), xlim = c(0, 180)) 

enter image description here

  • Related