admin管理员组

文章数量:1410682

I want the code to make a plot where I color code exposure temperature points within boxes. But the code shown here maps the point colors to population, a different grouping factor. I can't get it to map to a different grouping factor and I am not 100% sure that the points are mapped to the correct box in the plot. I will paste the data beneath the code.

library(ggplot2)
library(dplyr)
library(ggnewscale)  # <-- Important for multiple color scales!

# Set the working directory (update if needed)
setwd("/")

# Load the dataset
df <- read.csv("2021experiment_qPCR_genes.csv")

# Define gene categories
gene_categories <- c(
  "CO1"   = "Mitochondrial",
  "RPS3"  = "Protein Synthesis",
  "RPS18" = "Protein Synthesis",
  "SDHBa" = "Metabolism",
  "SDHBb" = "Metabolism"
)

# Add new columns: GeneCategory, Population, ExposureTempC
df <- df %>%
  mutate(
    GeneCategory   = factor(gene_categories[Gene], 
                            levels = c("Mitochondrial", 
                                       "Protein Synthesis", 
                                       "Metabolism")),
    Population     = factor(Population, 
                            levels = c("Big Pine Creek", "Rock Creek")),  # Reversed order
    ExposureTempC  = factor(ExposureTempC, 
                            levels = c("20°C", "36°C"))  # Ensure Temperature is a factor
  )

# Define colors for temperature (36°C = red, 20°C = blue)
temp_colors <- c("20°C" = "blue", 
                 "36°C" = "red")

# Define colors for populations
population_colors <- c("Big Pine Creek" = "#9B1F38", 
                       "Rock Creek"     = "#1A2B80")

# -----------------------
# Create the plot (tiled)
# -----------------------
p <- ggplot(df, aes(x = Gene, y = BoxCoxCt)) +
  
  # 1) BOXES first: fill by GeneCategory, outline color by Population
  geom_boxplot(aes(fill = GeneCategory, color = Population),
               alpha = 0.5,
               outlier.shape = NA,  # removes outliers from boxplots
               size = 1,
               position = position_dodge(width = 0.75)) +
  
  # 2) Fill scale for GeneCategory
  scale_fill_manual(
    values = c("Mitochondrial"     = "#FFD700",
               "Protein Synthesis" = "#59D9C9",
               "Metabolism"        = "#B785D6"),
    name = "Gene Category"
  ) +
  
  # 3) First color scale: Population (box outlines)
  scale_color_manual(
    values = population_colors,
    name = "Population"
  ) +
  
  # 4) End that color scale; start a NEW one
  new_scale_color() +
  
  # 5) POINTS second: color by ExposureTempC
  geom_point(aes(color = ExposureTempC),
             size = 2, # smaller point size
             position = position_jitterdodge(
               jitter.width = 0.1, 
               dodge.width = 0.75
             )) +
  
  # 6) Second color scale: Temperature (points)
  scale_color_manual(
    values = temp_colors, 
    name = "Temperature"
  ) +
  
  # 7) Facet by RearingElev (stack CCR and OVS)
  facet_wrap(~ RearingElev, ncol = 1) +



  # 8) Theme adjustments
  theme_minimal() +
  theme(
    axis.text.x         = element_text(angle = 45, hjust = 1, size = 14),
    axis.text.y         = element_text(size = 14),
    axis.title.x        = element_text(size = 16),
    axis.title.y        = element_text(size = 16),
    strip.text.x        = element_text(size = 14),  # facet label size
    panel.grid          = element_blank(),          # remove grid lines
    panel.border        = element_blank(),          
    # Add BOTH top and bottom x-axis lines
    axis.line.x.bottom  = element_line(color = "black"),
    axis.line.x.top     = element_line(color = "black"),
    # Turn on y-axis line
    axis.line.y.left    = element_line(color = "black"),
    # Add y-axis ticks (and x ticks if desired)
    axis.ticks.y        = element_line(color = "black"),
    axis.ticks.x        = element_line(color = "black"),
    legend.position     = "right"
  ) +
  labs(
    x     = "Gene",
    y     = "Expression Value (Box-Cox)",
    title = "Gene Expression by Exposure Temperature and Population"
  ) +
  scale_x_discrete(position = "bottom")

# Save to PDF
pdf("gene_expression_plot_final_fixed.pdf", width = 8, height = 6)
print(p)
dev.off()

# Save to PNG
ggsave("gene_expression_plot_final_fixed.png", 
       plot   = p, 
       width  = 8, 
       height = 6, 
       units  = "in", 
       dpi    = 300)

# Show the plot
print(p)


Data:

structure(list(Population = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), levels = c("Big Pine Creek", 
"Rock Creek"), class = "factor"), RearingElev = c("CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)"), ExposureTempC = structure(c(2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), levels = c("20°C", 
"36°C"), class = "factor"), Larva.ID = c("05B_3_CCR", "05B_3_CCR", 
"05B_3_CCR", "05B_3_CCR", "05B_3_CCR", "05C_2_OVS", "05C_2_OVS", 
"05C_2_OVS", "05C_2_OVS", "05C_2_OVS", "19B_2_CCR", "19B_2_CCR", 
"19B_2_CCR", "19B_2_CCR", "19B_2_CCR", "19B_2_OVS", "19B_2_OVS", 
"19B_2_OVS", "19B_2_OVS", "19B_2_OVS", "20A_4_OVS", "20A_4_OVS", 
"20A_4_OVS", "20A_4_OVS", "20A_4_OVS", "20B_2_CCR", "20B_2_CCR", 
"20B_2_CCR", "20B_2_CCR", "20B_2_CCR", "21B_3_OVS", "21B_3_OVS", 
"21B_3_OVS", "21B_3_OVS", "21B_3_OVS", "21C_1_CCR", "21C_1_CCR", 
"21C_1_CCR", "21C_1_CCR", "21C_1_CCR", "23A_1_OVS", "23A_1_OVS", 
"23A_1_OVS", "23A_1_OVS", "23A_1_OVS", "23A_4_CCR", "23A_4_CCR", 
"23A_4_CCR", "23A_4_CCR", "23A_4_CCR", "25C_2_CCR", "25C_2_CCR", 
"25C_2_CCR", "25C_2_CCR", "25C_2_CCR", "25C_2_OVS", "25C_2_OVS", 
"25C_2_OVS", "25C_2_OVS", "25C_2_OVS", "31A_2_CCR", "31A_2_CCR", 
"31A_2_CCR", "31A_2_CCR", "31A_2_CCR", "31A_4_OVS", "31A_4_OVS", 
"31A_4_OVS", "31A_4_OVS", "31A_4_OVS", "32B_3_OVS", "32B_3_OVS", 
"32B_3_OVS", "32B_3_OVS", "32B_3_OVS", "32C_1_CCR", "32C_1_CCR", 
"32C_1_CCR", "32C_1_CCR", "32C_1_CCR", "36D_4_CCR", "36D_4_CCR", 
"36D_4_CCR", "36D_4_CCR", "36D_4_CCR", "36D_4_OVS", "36D_4_OVS", 
"36D_4_OVS", "36D_4_OVS", "36D_4_OVS", "38B_1_OVS", "38B_1_OVS", 
"38B_1_OVS", "38B_1_OVS", "38B_1_OVS", "38B_3_CCR", "38B_3_CCR", 
"38B_3_CCR", "38B_3_CCR", "38B_3_CCR", "39A_1_OVS", "39A_1_OVS", 
"39A_1_OVS", "39A_1_OVS", "39A_1_OVS", "39A_4_CCR", "39A_4_CCR", 
"39A_4_CCR", "39A_4_CCR", "39A_4_CCR", "42B_2_OVS", "42B_2_OVS", 
"42B_2_OVS", "42B_2_OVS", "42B_2_OVS", "42B_4_CCR", "42B_4_CCR", 
"42B_4_CCR", "42B_4_CCR", "42B_4_CCR", "42C_1_CCR", "42C_1_CCR", 
"42C_1_CCR", "42C_1_CCR", "42C_1_CCR", "42C_1_OVS", "42C_1_OVS", 
"42C_1_OVS", "42C_1_OVS", "42C_1_OVS", "44A_2_CCR", "44A_2_CCR", 
"44A_2_CCR", "44A_2_CCR", "44A_2_CCR", "44A_4_OVS", "44A_4_OVS", 
"44A_4_OVS", "44A_4_OVS", "44A_4_OVS", "55B_1_CCR", "55B_1_CCR", 
"55B_1_CCR", "55B_1_CCR", "55B_1_CCR", "55C_1_OVS", "55C_1_OVS", 
"55C_1_OVS", "55C_1_OVS", "55C_1_OVS", "59A_1_CCR", "59A_1_CCR", 
"59A_1_CCR", "59A_1_CCR", "59A_1_CCR", "59A_3_OVS", "59A_3_OVS", 
"59A_3_OVS", "59A_3_OVS", "59A_3_OVS", "63B_2_CCR", "63B_2_CCR", 
"63B_2_CCR", "63B_2_CCR", "63B_2_CCR", "63B_2_OVS", "63B_2_OVS", 
"63B_2_OVS", "63B_2_OVS", "63B_2_OVS", "66A_4_CCR", "66A_4_CCR", 
"66A_4_CCR", "66A_4_CCR", "66A_4_CCR", "66B_2_OVS", "66B_2_OVS", 
"66B_2_OVS", "66B_2_OVS", "66B_2_OVS", "71C_2_OVS", "71C_2_OVS", 
"71C_2_OVS", "71C_2_OVS", "71C_2_OVS", "71C_4_CCR", "71C_4_CCR", 
"71C_4_CCR", "71C_4_CCR", "71C_4_CCR"), Gene = c("CO1", "RPS18", 
"RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", 
"CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", 
"SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", 
"RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", 
"SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", 
"RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", 
"CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", 
"SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", 
"RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", 
"SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", 
"RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", 
"CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", 
"SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", 
"RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", 
"SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", 
"RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", 
"CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", 
"SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", 
"RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", 
"SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", 
"RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", 
"CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", 
"SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", 
"RPS18", "RPS3", "SDHBb", "SDHBa"), BoxCoxCt = c(1153.785064, 
1153.3330972, 1157.8773038, 1160.7812295, 1159.3249702, 1152.8493979, 
1154.75196, 1158.6835238, 1163.3869751, 1159.5583676, 1158.0859612, 
1157.1054814, 1161.0814585, 1165.2628925, 1161.7629801, 1154.8156767, 
1154.1846296, 1159.0969046, 1162.5241738, 1158.3939237, 1156.8781143, 
1155.9550949, 1159.8049574, 1160.1069222, 1160.1499234, 1154.7576995, 
1154.3777093, 1158.7692338, 1155.8031171, 1158.0625595, 1157.6450891, 
1155.401337, 1158.656948, 1164.5433206, 1159.0369292, 1158.411655, 
1158.9713643, 1162.161972, 1165.2628925, 1163.1535991, 1152.1974566, 
1155.7117096, 1157.2384112, 1162.0448732, 1159.0986116, 1156.2027594, 
1152.0197466, 1158.4865631, 1161.5885228, 1159.3182609, 1158.9352635, 
1155.4319911, 1157.655569, 1163.1724474, 1158.903678, 1156.2767647, 
1154.7592593, 1158.497349, 1162.4112794, 1159.7530779, 1156.0211254, 
1155.1636002, 1158.9305397, 1159.8819075, 1159.5235572, 1157.6581236, 
1156.301795, 1159.2993927, 1163.3330524, 1160.3639047, 1152.1438019, 
1153.6118533, 1157.8648343, 1160.3079935, 1157.7549163, 1156.5418593, 
1154.5030424, 1159.6845041, 1159.4834108, 1160.7732796, 1156.1268851, 
1156.9471035, 1160.1082452, 1161.5752492, 1160.0179531, 1155.832561, 
1152.717972, 1158.923254, 1162.709987, 1158.1736444, 1156.8960868, 
1156.5195235, 1160.4082776, 1160.0356211, 1159.8817071, 1156.8808809, 
1156.6830702, 1160.4749978, 1161.9663674, 1160.9508598, 1160.6979716, 
1159.0821577, 1161.7138446, 1165.2628925, 1162.7049252, 1155.6792226, 
1154.5845231, 1158.2512588, 1163.4324569, 1159.5555489, 1155.1304113, 
1152.5885652, 1159.6718035, 1160.8696298, 1159.5094154, 1155.2197381, 
1155.13662, 1159.1715838, 1162.9341326, 1158.8529534, 1154.4527276, 
1155.8569068, 1160.3779861, 1165.2628925, 1162.3450309, 1157.9415546, 
1158.2822785, 1161.412776, 1161.734822, 1161.3289403, 1157.9835272, 
1155.1038908, 1159.1664836, 1165.2628925, 1162.0562191, 1156.4006477, 
1153.2992979, 1159.0969046, 1158.7499961, 1159.0751509, 1157.1356639, 
1155.0939147, 1161.0087539, 1162.1902394, 1159.7945789, 1154.8798219, 
1153.4340444, 1159.1868712, 1163.2046624, 1160.8414669, 1156.6351798, 
1155.6268737, 1157.843267, 1159.3384136, 1160.3927732, 1157.8533401, 
1156.907209, 1160.645019, 1163.3594653, 1161.6732296, 1155.8265797, 
1154.9015808, 1159.5084019, 1162.4742962, 1159.7715411, 1156.0299701, 
1154.9779641, 1159.0815017, 1163.0860174, 1159.0614443, 1156.2027594, 
1154.9635835, 1157.2740894, 1161.9420921, 1159.4754057, 1158.6100416, 
1155.5787524, 1159.5716703, 1164.3069188, 1160.0215643, 1158.9716479, 
1156.664008, 1159.4577399, 1164.3412959, 1159.0349658, 1158.0708384, 
1156.6818002, 1160.496847, 1164.3492107, 1160.6817049), GeneCategory = structure(c(CO1 = 1L, 
RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, 
RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, 
SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, 
SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, 
CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, 
RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, 
RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, 
SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, 
SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, 
CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, 
RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, 
RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, 
SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, 
SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, 
CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, 
RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, 
RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, 
SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, 
SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, 
CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, 
RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, 
RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, 
SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, 
SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, 
CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, 
RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, 
RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, 
SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, 
SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, 
CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, 
RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, 
RPS3 = 2L, SDHBb = 3L, SDHBa = 3L), levels = c("Mitochondrial", 
"Protein Synthesis", "Metabolism"), class = "factor")), class = "data.frame", row.names = c(NA, 
-190L))

I want the code to make a plot where I color code exposure temperature points within boxes. But the code shown here maps the point colors to population, a different grouping factor. I can't get it to map to a different grouping factor and I am not 100% sure that the points are mapped to the correct box in the plot. I will paste the data beneath the code.

library(ggplot2)
library(dplyr)
library(ggnewscale)  # <-- Important for multiple color scales!

# Set the working directory (update if needed)
setwd("/")

# Load the dataset
df <- read.csv("2021experiment_qPCR_genes.csv")

# Define gene categories
gene_categories <- c(
  "CO1"   = "Mitochondrial",
  "RPS3"  = "Protein Synthesis",
  "RPS18" = "Protein Synthesis",
  "SDHBa" = "Metabolism",
  "SDHBb" = "Metabolism"
)

# Add new columns: GeneCategory, Population, ExposureTempC
df <- df %>%
  mutate(
    GeneCategory   = factor(gene_categories[Gene], 
                            levels = c("Mitochondrial", 
                                       "Protein Synthesis", 
                                       "Metabolism")),
    Population     = factor(Population, 
                            levels = c("Big Pine Creek", "Rock Creek")),  # Reversed order
    ExposureTempC  = factor(ExposureTempC, 
                            levels = c("20°C", "36°C"))  # Ensure Temperature is a factor
  )

# Define colors for temperature (36°C = red, 20°C = blue)
temp_colors <- c("20°C" = "blue", 
                 "36°C" = "red")

# Define colors for populations
population_colors <- c("Big Pine Creek" = "#9B1F38", 
                       "Rock Creek"     = "#1A2B80")

# -----------------------
# Create the plot (tiled)
# -----------------------
p <- ggplot(df, aes(x = Gene, y = BoxCoxCt)) +
  
  # 1) BOXES first: fill by GeneCategory, outline color by Population
  geom_boxplot(aes(fill = GeneCategory, color = Population),
               alpha = 0.5,
               outlier.shape = NA,  # removes outliers from boxplots
               size = 1,
               position = position_dodge(width = 0.75)) +
  
  # 2) Fill scale for GeneCategory
  scale_fill_manual(
    values = c("Mitochondrial"     = "#FFD700",
               "Protein Synthesis" = "#59D9C9",
               "Metabolism"        = "#B785D6"),
    name = "Gene Category"
  ) +
  
  # 3) First color scale: Population (box outlines)
  scale_color_manual(
    values = population_colors,
    name = "Population"
  ) +
  
  # 4) End that color scale; start a NEW one
  new_scale_color() +
  
  # 5) POINTS second: color by ExposureTempC
  geom_point(aes(color = ExposureTempC),
             size = 2, # smaller point size
             position = position_jitterdodge(
               jitter.width = 0.1, 
               dodge.width = 0.75
             )) +
  
  # 6) Second color scale: Temperature (points)
  scale_color_manual(
    values = temp_colors, 
    name = "Temperature"
  ) +
  
  # 7) Facet by RearingElev (stack CCR and OVS)
  facet_wrap(~ RearingElev, ncol = 1) +



  # 8) Theme adjustments
  theme_minimal() +
  theme(
    axis.text.x         = element_text(angle = 45, hjust = 1, size = 14),
    axis.text.y         = element_text(size = 14),
    axis.title.x        = element_text(size = 16),
    axis.title.y        = element_text(size = 16),
    strip.text.x        = element_text(size = 14),  # facet label size
    panel.grid          = element_blank(),          # remove grid lines
    panel.border        = element_blank(),          
    # Add BOTH top and bottom x-axis lines
    axis.line.x.bottom  = element_line(color = "black"),
    axis.line.x.top     = element_line(color = "black"),
    # Turn on y-axis line
    axis.line.y.left    = element_line(color = "black"),
    # Add y-axis ticks (and x ticks if desired)
    axis.ticks.y        = element_line(color = "black"),
    axis.ticks.x        = element_line(color = "black"),
    legend.position     = "right"
  ) +
  labs(
    x     = "Gene",
    y     = "Expression Value (Box-Cox)",
    title = "Gene Expression by Exposure Temperature and Population"
  ) +
  scale_x_discrete(position = "bottom")

# Save to PDF
pdf("gene_expression_plot_final_fixed.pdf", width = 8, height = 6)
print(p)
dev.off()

# Save to PNG
ggsave("gene_expression_plot_final_fixed.png", 
       plot   = p, 
       width  = 8, 
       height = 6, 
       units  = "in", 
       dpi    = 300)

# Show the plot
print(p)


Data:

structure(list(Population = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), levels = c("Big Pine Creek", 
"Rock Creek"), class = "factor"), RearingElev = c("CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)", "CCR (3100 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", "OVS (1250 m)", 
"CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", "CCR (3100 m)", 
"CCR (3100 m)"), ExposureTempC = structure(c(2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), levels = c("20°C", 
"36°C"), class = "factor"), Larva.ID = c("05B_3_CCR", "05B_3_CCR", 
"05B_3_CCR", "05B_3_CCR", "05B_3_CCR", "05C_2_OVS", "05C_2_OVS", 
"05C_2_OVS", "05C_2_OVS", "05C_2_OVS", "19B_2_CCR", "19B_2_CCR", 
"19B_2_CCR", "19B_2_CCR", "19B_2_CCR", "19B_2_OVS", "19B_2_OVS", 
"19B_2_OVS", "19B_2_OVS", "19B_2_OVS", "20A_4_OVS", "20A_4_OVS", 
"20A_4_OVS", "20A_4_OVS", "20A_4_OVS", "20B_2_CCR", "20B_2_CCR", 
"20B_2_CCR", "20B_2_CCR", "20B_2_CCR", "21B_3_OVS", "21B_3_OVS", 
"21B_3_OVS", "21B_3_OVS", "21B_3_OVS", "21C_1_CCR", "21C_1_CCR", 
"21C_1_CCR", "21C_1_CCR", "21C_1_CCR", "23A_1_OVS", "23A_1_OVS", 
"23A_1_OVS", "23A_1_OVS", "23A_1_OVS", "23A_4_CCR", "23A_4_CCR", 
"23A_4_CCR", "23A_4_CCR", "23A_4_CCR", "25C_2_CCR", "25C_2_CCR", 
"25C_2_CCR", "25C_2_CCR", "25C_2_CCR", "25C_2_OVS", "25C_2_OVS", 
"25C_2_OVS", "25C_2_OVS", "25C_2_OVS", "31A_2_CCR", "31A_2_CCR", 
"31A_2_CCR", "31A_2_CCR", "31A_2_CCR", "31A_4_OVS", "31A_4_OVS", 
"31A_4_OVS", "31A_4_OVS", "31A_4_OVS", "32B_3_OVS", "32B_3_OVS", 
"32B_3_OVS", "32B_3_OVS", "32B_3_OVS", "32C_1_CCR", "32C_1_CCR", 
"32C_1_CCR", "32C_1_CCR", "32C_1_CCR", "36D_4_CCR", "36D_4_CCR", 
"36D_4_CCR", "36D_4_CCR", "36D_4_CCR", "36D_4_OVS", "36D_4_OVS", 
"36D_4_OVS", "36D_4_OVS", "36D_4_OVS", "38B_1_OVS", "38B_1_OVS", 
"38B_1_OVS", "38B_1_OVS", "38B_1_OVS", "38B_3_CCR", "38B_3_CCR", 
"38B_3_CCR", "38B_3_CCR", "38B_3_CCR", "39A_1_OVS", "39A_1_OVS", 
"39A_1_OVS", "39A_1_OVS", "39A_1_OVS", "39A_4_CCR", "39A_4_CCR", 
"39A_4_CCR", "39A_4_CCR", "39A_4_CCR", "42B_2_OVS", "42B_2_OVS", 
"42B_2_OVS", "42B_2_OVS", "42B_2_OVS", "42B_4_CCR", "42B_4_CCR", 
"42B_4_CCR", "42B_4_CCR", "42B_4_CCR", "42C_1_CCR", "42C_1_CCR", 
"42C_1_CCR", "42C_1_CCR", "42C_1_CCR", "42C_1_OVS", "42C_1_OVS", 
"42C_1_OVS", "42C_1_OVS", "42C_1_OVS", "44A_2_CCR", "44A_2_CCR", 
"44A_2_CCR", "44A_2_CCR", "44A_2_CCR", "44A_4_OVS", "44A_4_OVS", 
"44A_4_OVS", "44A_4_OVS", "44A_4_OVS", "55B_1_CCR", "55B_1_CCR", 
"55B_1_CCR", "55B_1_CCR", "55B_1_CCR", "55C_1_OVS", "55C_1_OVS", 
"55C_1_OVS", "55C_1_OVS", "55C_1_OVS", "59A_1_CCR", "59A_1_CCR", 
"59A_1_CCR", "59A_1_CCR", "59A_1_CCR", "59A_3_OVS", "59A_3_OVS", 
"59A_3_OVS", "59A_3_OVS", "59A_3_OVS", "63B_2_CCR", "63B_2_CCR", 
"63B_2_CCR", "63B_2_CCR", "63B_2_CCR", "63B_2_OVS", "63B_2_OVS", 
"63B_2_OVS", "63B_2_OVS", "63B_2_OVS", "66A_4_CCR", "66A_4_CCR", 
"66A_4_CCR", "66A_4_CCR", "66A_4_CCR", "66B_2_OVS", "66B_2_OVS", 
"66B_2_OVS", "66B_2_OVS", "66B_2_OVS", "71C_2_OVS", "71C_2_OVS", 
"71C_2_OVS", "71C_2_OVS", "71C_2_OVS", "71C_4_CCR", "71C_4_CCR", 
"71C_4_CCR", "71C_4_CCR", "71C_4_CCR"), Gene = c("CO1", "RPS18", 
"RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", 
"CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", 
"SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", 
"RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", 
"SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", 
"RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", 
"CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", 
"SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", 
"RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", 
"SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", 
"RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", 
"CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", 
"SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", 
"RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", 
"SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", 
"RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", 
"CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", 
"SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", 
"RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", 
"SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", 
"RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", 
"CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", 
"SDHBb", "SDHBa", "CO1", "RPS18", "RPS3", "SDHBb", "SDHBa", "CO1", 
"RPS18", "RPS3", "SDHBb", "SDHBa"), BoxCoxCt = c(1153.785064, 
1153.3330972, 1157.8773038, 1160.7812295, 1159.3249702, 1152.8493979, 
1154.75196, 1158.6835238, 1163.3869751, 1159.5583676, 1158.0859612, 
1157.1054814, 1161.0814585, 1165.2628925, 1161.7629801, 1154.8156767, 
1154.1846296, 1159.0969046, 1162.5241738, 1158.3939237, 1156.8781143, 
1155.9550949, 1159.8049574, 1160.1069222, 1160.1499234, 1154.7576995, 
1154.3777093, 1158.7692338, 1155.8031171, 1158.0625595, 1157.6450891, 
1155.401337, 1158.656948, 1164.5433206, 1159.0369292, 1158.411655, 
1158.9713643, 1162.161972, 1165.2628925, 1163.1535991, 1152.1974566, 
1155.7117096, 1157.2384112, 1162.0448732, 1159.0986116, 1156.2027594, 
1152.0197466, 1158.4865631, 1161.5885228, 1159.3182609, 1158.9352635, 
1155.4319911, 1157.655569, 1163.1724474, 1158.903678, 1156.2767647, 
1154.7592593, 1158.497349, 1162.4112794, 1159.7530779, 1156.0211254, 
1155.1636002, 1158.9305397, 1159.8819075, 1159.5235572, 1157.6581236, 
1156.301795, 1159.2993927, 1163.3330524, 1160.3639047, 1152.1438019, 
1153.6118533, 1157.8648343, 1160.3079935, 1157.7549163, 1156.5418593, 
1154.5030424, 1159.6845041, 1159.4834108, 1160.7732796, 1156.1268851, 
1156.9471035, 1160.1082452, 1161.5752492, 1160.0179531, 1155.832561, 
1152.717972, 1158.923254, 1162.709987, 1158.1736444, 1156.8960868, 
1156.5195235, 1160.4082776, 1160.0356211, 1159.8817071, 1156.8808809, 
1156.6830702, 1160.4749978, 1161.9663674, 1160.9508598, 1160.6979716, 
1159.0821577, 1161.7138446, 1165.2628925, 1162.7049252, 1155.6792226, 
1154.5845231, 1158.2512588, 1163.4324569, 1159.5555489, 1155.1304113, 
1152.5885652, 1159.6718035, 1160.8696298, 1159.5094154, 1155.2197381, 
1155.13662, 1159.1715838, 1162.9341326, 1158.8529534, 1154.4527276, 
1155.8569068, 1160.3779861, 1165.2628925, 1162.3450309, 1157.9415546, 
1158.2822785, 1161.412776, 1161.734822, 1161.3289403, 1157.9835272, 
1155.1038908, 1159.1664836, 1165.2628925, 1162.0562191, 1156.4006477, 
1153.2992979, 1159.0969046, 1158.7499961, 1159.0751509, 1157.1356639, 
1155.0939147, 1161.0087539, 1162.1902394, 1159.7945789, 1154.8798219, 
1153.4340444, 1159.1868712, 1163.2046624, 1160.8414669, 1156.6351798, 
1155.6268737, 1157.843267, 1159.3384136, 1160.3927732, 1157.8533401, 
1156.907209, 1160.645019, 1163.3594653, 1161.6732296, 1155.8265797, 
1154.9015808, 1159.5084019, 1162.4742962, 1159.7715411, 1156.0299701, 
1154.9779641, 1159.0815017, 1163.0860174, 1159.0614443, 1156.2027594, 
1154.9635835, 1157.2740894, 1161.9420921, 1159.4754057, 1158.6100416, 
1155.5787524, 1159.5716703, 1164.3069188, 1160.0215643, 1158.9716479, 
1156.664008, 1159.4577399, 1164.3412959, 1159.0349658, 1158.0708384, 
1156.6818002, 1160.496847, 1164.3492107, 1160.6817049), GeneCategory = structure(c(CO1 = 1L, 
RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, 
RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, 
SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, 
SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, 
CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, 
RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, 
RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, 
SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, 
SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, 
CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, 
RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, 
RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, 
SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, 
SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, 
CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, 
RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, 
RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, 
SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, 
SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, 
CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, 
RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, 
RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, 
SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, 
SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, 
CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, 
RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, 
RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, 
SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, 
SDHBa = 3L, CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, 
CO1 = 1L, RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, 
RPS18 = 2L, RPS3 = 2L, SDHBb = 3L, SDHBa = 3L, CO1 = 1L, RPS18 = 2L, 
RPS3 = 2L, SDHBb = 3L, SDHBa = 3L), levels = c("Mitochondrial", 
"Protein Synthesis", "Metabolism"), class = "factor")), class = "data.frame", row.names = c(NA, 
-190L))
Share Improve this question edited Mar 6 at 13:32 stefan 127k6 gold badges38 silver badges76 bronze badges Recognized by R Language Collective asked Mar 6 at 5:58 n rankn rank 311 silver badge1 bronze badge 1
  • 2 Welcome to SO. Please replace your copy-and-paste of your csv file with the output of dput(df)) and remove all the code related to the construction of df: it’s simply not relevant. – Limey Commented Mar 6 at 6:05
Add a comment  | 

1 Answer 1

Reset to default 1

You are right. The points are assigned to the wrong boxes due to the different grouping, i.e. your box plots get dodged by Population whereas the points get dodged by ExposureTempC. To fix that you have to explicitly map Population on the group aes in geom_point.

As a check I added a geom_text layer.

library(ggplot2)
library(ggnewscale)

ggplot(df, aes(x = Gene, y = BoxCoxCt)) +
  geom_boxplot(aes(fill = GeneCategory, color = Population),
    alpha = 0.5,
    outlier.shape = NA, # removes outliers from boxplots
    size = 1,
    position = position_dodge(width = 0.75)
  ) +
  scale_fill_manual(
    values = c(
      "Mitochondrial" = "#FFD700",
      "Protein Synthesis" = "#59D9C9",
      "Metabolism" = "#B785D6"
    ),
    name = "Gene Category"
  ) +
  scale_color_manual(
    values = population_colors,
    name = "Population"
  ) +
  new_scale_color() +
  geom_point(
    aes(
      color = ExposureTempC,
      group = Population
    ),
    size = 2, # smaller point size
    position = position_jitterdodge(
      jitter.width = 0.1,
      dodge.width = 0.75,
    )
  ) +
  geom_text(
    aes(
      label = Population,
      group = Population
    ),
    size = 2, # smaller point size
    position = position_dodge(
      width = 0.75
    )
  ) +
  scale_color_manual(
    values = temp_colors,
    name = "Temperature"
  ) +
  facet_wrap(~RearingElev, ncol = 1) +
  theme_minimal() +
  theme(
    axis.text.x         = element_text(angle = 45, hjust = 1, size = 14),
    axis.text.y         = element_text(size = 14),
    axis.title.x        = element_text(size = 16),
    axis.title.y        = element_text(size = 16),
    strip.text.x        = element_text(size = 14), # facet label size
    panel.grid          = element_blank(), # remove grid lines
    panel.border        = element_blank(),
    axis.line.x.bottom  = element_line(color = "black"),
    axis.line.x.top     = element_line(color = "black"),
    axis.line.y.left    = element_line(color = "black"),
    axis.ticks.y        = element_line(color = "black"),
    axis.ticks.x        = element_line(color = "black"),
    legend.position     = "right"
  ) +
  labs(
    x     = "Gene",
    y     = "Expression Value (Box-Cox)",
    title = "Gene Expression by Exposure Temperature and Population"
  ) +
  scale_x_discrete(position = "bottom")

本文标签: rmatching points on a tiled box plots to the proper categoryStack Overflow