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
|
1 Answer
Reset to default 1You 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
版权声明:本文标题:r - matching points on a tiled box plots to the proper category - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744994648a2636597.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
dput(df))
and remove all the code related to the construction ofdf
: it’s simply not relevant. – Limey Commented Mar 6 at 6:05