This notebook provides a simple example of how one can create
barplots easily from PeakGroup data exported from TraceBase.
First, we load our required libraries.
# Load required libraries
Warning messages:
1: replacing previous import ‘lifecycle::last_warnings’ by ‘rlang::last_warnings’ when loading ‘hms’
2: replacing previous import ‘lifecycle::last_warnings’ by ‘rlang::last_warnings’ when loading ‘tibble’
3: replacing previous import ‘lifecycle::last_warnings’ by ‘rlang::last_warnings’ when loading ‘pillar’
library(readr, quietly = TRUE)
library(stringr, quietly = TRUE)
library(ggplot2, quietly = TRUE)
library(Rmisc, quietly = TRUE)
library(dplyr, quietly = TRUE, warn.conflicts = FALSE)
Serine Labeling from Serine Synthesis Study
Load PeakGroup data
The PeakGroup data was downloaded from TraceBase by:
- View a specific study Serine
synthesis from glucose in control vs ser/gly-free diet
- Click the “PeakGroup Data” link at the top
- Click on the “Export Data” button
serinesyn_peakgroup_data_table <-
"data/serine_synthesis/PeakGroups_10.02.2023.16.17.17.tsv"
serinesyn_peakgroup_data <-
readr::read_tsv(serinesyn_peakgroup_data_table,
comment = "#", na = c("None")
)
Rows: 561 Columns: 27── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (18): Sample, Tissue, Peak Group, Measured Compound(s), Measured Compound Synonym(s), Formula, Labeled Element, Peak Group Set Filename, Anim...
dbl (8): Time Collected (m), Total Abundance, Enrichment Fraction, Enrichment Abundance, Normalized Labeling, Body Weight (g), Tracer Concentrat...
lgl (1): Age (weeks)
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
serinesyn_peakgroup_data
Plot Normalized Labeling of Glucose (not Malate) by Feeding Status
per Tissue
For this example, we are going to plot the “Normalized Labeling” of
Glucose (not Malate), for tissue, split by “Feeding Status”.
Select data
Select those rows that used a glucose tracer and
measured serine.
# Select columns
serinesyn_plot_data <-
serinesyn_peakgroup_data %>%
filter(
str_detect(`Infusate`, "glucose-"),
`Measured Compound(s)` == "serine"
)
serinesyn_plot_data
Calculate summary statistics
We use the summarySE function to calculate the standard
error for each group.
serinesyn_summary_data <- serinesyn_plot_data %>%
Rmisc::summarySE(
measurevar = "Normalized Labeling",
groupvars = c("`Feeding Status`", "Tissue"),
na.rm = TRUE
)
serinesyn_summary_data
Generate the bar plot
Now we setup the plotting parameters.
# Setup the plot
p <- ggplot(
data = serinesyn_summary_data,
aes(x = `Tissue`, y = `Normalized Labeling`, fill = `Feeding Status`)
) +
geom_bar(stat = "identity", position = "dodge") +
geom_errorbar(aes(
ymin = `Normalized Labeling` - sd,
ymax = `Normalized Labeling` + sd
),
width = .2,
position = position_dodge(0.9)
) +
theme_gray(base_size = 22) +
theme(axis.text.x = element_text(angle = -45, vjust = 0.5, hjust = 0)) +
ggtitle("Normalized Labeling of Serine with Glucose Tracer",
subtitle = "Serine Synthesis Study"
)
# Display the plot
p

Serine Labeling from Multiple Studies
Load PeakGroup data
The PeakGroup data was downloaded from TraceBase by searching with: *
Output Format == “PeakGroups” * Mesured Compound == “serine” * Tracer
Compound == “glucose”
all_serine_peakgroup_table <-
"data/PeakGroups-serine-all-studies10.02.2023.16.21.50.tsv"
all_serine_peakgroup_data <-
readr::read_tsv(all_serine_peakgroup_table, comment = "#", na = c("None"))
Rows: 679 Columns: 27── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: "\t"
chr (18): Sample, Tissue, Peak Group, Measured Compound(s), Measured Compound Synonym(s), Formula, Labeled Element, Peak Group Set Filename, Anim...
dbl (9): Time Collected (m), Total Abundance, Enrichment Fraction, Enrichment Abundance, Normalized Labeling, Body Weight (g), Age (weeks), Trac...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
all_serine_peakgroup_data
Plot Normalized Labeling of Glucose (not Malate) by Feeding Status
per Tissue
For this example, we are going to plot the “Normalized Labeling” of
Glucose (not Malate), for tissue, split by “Feeding Status”.
Select data
Select those rows that used a glucose tracer and
measured serine for animals in the fasted
state.
all_serine_plot_data <- all_serine_peakgroup_data %>%
filter(
str_detect(`Infusate`, "glucose-"),
`Measured Compound(s)` == "serine",
`Feeding Status` == "fasted"
)
all_serine_plot_data
Calculate summary statistics
We use the summarySE function to calculate the standard
error for each group.
all_serine_summary_data <-
# Calculate summary statistics for each study/tissue group
all_serine_plot_data %>%
Rmisc::summarySE(
measurevar = "Normalized Labeling",
groupvars = c("Studies", "Tissue"),
na.rm = TRUE
) %>%
# Plot only tissues with data in all four Studies
group_by(Tissue) %>%
filter(length(unique(Studies)) >= 4) %>%
# Rename some studies
mutate(Studies = recode(Studies,
"fluxomics 2020" = "Fluxomics 2020",
"Serine synthesis from glucose in control vs ser/gly-free diet" =
"Serine synthesis"
))
Warning: NaNs produced
all_serine_summary_data
Generate the bar plot
Now we setup the plotting parameters.
# Setup the plot
all_serine_plot <- ggplot(
data = all_serine_summary_data,
aes(x = `Tissue`, y = `Normalized Labeling`, fill = `Studies`)
) +
geom_bar(stat = "identity", position = "dodge") +
geom_errorbar(aes(
ymin = `Normalized Labeling` - sd,
ymax = `Normalized Labeling` + sd
),
width = .2,
position = position_dodge(0.9)
) +
theme_gray(base_size = 22) +
theme(axis.text.x = element_text(angle = -45, vjust = 0.5, hjust = 0)) +
theme(legend.position = "top") +
# scale_fill_discrete(labels=c("Fluxomics 2020", "Serine Synthesis")) +
ggtitle("Normalized Labeling of Serine with Glucose Tracer",
subtitle = "Animals in Fasted State"
)
# Display the plot
all_serine_plot

LS0tCnRpdGxlOiAiVHJhY2VCYXNlIFBlYWtHcm91cCBQbG90cyIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCi0tLQoKVGhpcyBub3RlYm9vayBwcm92aWRlcyBhIHNpbXBsZSBleGFtcGxlIG9mIGhvdyBvbmUgY2FuIGNyZWF0ZSBiYXJwbG90cyBlYXNpbHkgZnJvbSBQZWFrR3JvdXAgZGF0YSBleHBvcnRlZCBmcm9tIFRyYWNlQmFzZS4KCkZpcnN0LCB3ZSBsb2FkIG91ciByZXF1aXJlZCBsaWJyYXJpZXMuCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQojIExvYWQgcmVxdWlyZWQgbGlicmFyaWVzCmxpYnJhcnkocmVhZHIsIHF1aWV0bHkgPSBUUlVFKQpsaWJyYXJ5KHN0cmluZ3IsIHF1aWV0bHkgPSBUUlVFKQpsaWJyYXJ5KGdncGxvdDIsIHF1aWV0bHkgPSBUUlVFKQpsaWJyYXJ5KFJtaXNjLCBxdWlldGx5ID0gVFJVRSkKbGlicmFyeShkcGx5ciwgcXVpZXRseSA9IFRSVUUsIHdhcm4uY29uZmxpY3RzID0gRkFMU0UpCmBgYAoKIyMgU2VyaW5lIExhYmVsaW5nIGZyb20gU2VyaW5lIFN5bnRoZXNpcyBTdHVkeQoKIyMjIExvYWQgUGVha0dyb3VwIGRhdGEKClRoZSBQZWFrR3JvdXAgZGF0YSB3YXMgZG93bmxvYWRlZCBmcm9tIFRyYWNlQmFzZSBieToKCjEuIFZpZXcgYSBzcGVjaWZpYyBzdHVkeSBbU2VyaW5lIHN5bnRoZXNpcyBmcm9tIGdsdWNvc2UgaW4gY29udHJvbCB2cyBzZXIvZ2x5LWZyZWUgZGlldF0oaHR0cHM6Ly90cmFjZWJhc2UucHJpbmNldG9uLmVkdS9EYXRhUmVwby9zdHVkaWVzLzIvKQoyLiBDbGljayB0aGUgIlBlYWtHcm91cCBEYXRhIiBsaW5rIGF0IHRoZSB0b3AKMy4gQ2xpY2sgb24gdGhlICJFeHBvcnQgRGF0YSIgYnV0dG9uCgpgYGB7cn0Kc2VyaW5lc3luX3BlYWtncm91cF9kYXRhX3RhYmxlIDwtCiAgImRhdGEvc2VyaW5lX3N5bnRoZXNpcy9QZWFrR3JvdXBzXzEwLjAyLjIwMjMuMTYuMTcuMTcudHN2IgpzZXJpbmVzeW5fcGVha2dyb3VwX2RhdGEgPC0KICByZWFkcjo6cmVhZF90c3Yoc2VyaW5lc3luX3BlYWtncm91cF9kYXRhX3RhYmxlLAogICAgY29tbWVudCA9ICIjIiwgbmEgPSBjKCJOb25lIikKICApCnNlcmluZXN5bl9wZWFrZ3JvdXBfZGF0YQpgYGAKCiMjIyBQbG90IE5vcm1hbGl6ZWQgTGFiZWxpbmcgb2YgR2x1Y29zZSAobm90IE1hbGF0ZSkgYnkgRmVlZGluZyBTdGF0dXMgcGVyIFRpc3N1ZQoKRm9yIHRoaXMgZXhhbXBsZSwgd2UgYXJlIGdvaW5nIHRvIHBsb3QgdGhlICJOb3JtYWxpemVkIExhYmVsaW5nIiBvZiBHbHVjb3NlIChub3QgTWFsYXRlKSwgZm9yIHRpc3N1ZSwgc3BsaXQgYnkgIkZlZWRpbmcgU3RhdHVzIi4KCiMjIyMgU2VsZWN0IGRhdGEKClNlbGVjdCB0aG9zZSByb3dzIHRoYXQgdXNlZCBhIGBnbHVjb3NlYCB0cmFjZXIgYW5kIG1lYXN1cmVkIGBzZXJpbmVgLgpgYGB7cn0KIyBTZWxlY3QgY29sdW1ucwpzZXJpbmVzeW5fcGxvdF9kYXRhIDwtCiAgc2VyaW5lc3luX3BlYWtncm91cF9kYXRhICU+JQogIGZpbHRlcigKICAgIHN0cl9kZXRlY3QoYEluZnVzYXRlYCwgImdsdWNvc2UtIiksCiAgICBgTWVhc3VyZWQgQ29tcG91bmQocylgID09ICJzZXJpbmUiCiAgKQpzZXJpbmVzeW5fcGxvdF9kYXRhCmBgYAoKCiMjIyMgQ2FsY3VsYXRlIHN1bW1hcnkgc3RhdGlzdGljcwoKV2UgdXNlIHRoZSBgc3VtbWFyeVNFYCBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIHN0YW5kYXJkIGVycm9yIGZvciBlYWNoIGdyb3VwLgpgYGB7cn0Kc2VyaW5lc3luX3N1bW1hcnlfZGF0YSA8LSBzZXJpbmVzeW5fcGxvdF9kYXRhICU+JQogIFJtaXNjOjpzdW1tYXJ5U0UoCiAgICBtZWFzdXJldmFyID0gIk5vcm1hbGl6ZWQgTGFiZWxpbmciLAogICAgZ3JvdXB2YXJzID0gYygiYEZlZWRpbmcgU3RhdHVzYCIsICJUaXNzdWUiKSwKICAgIG5hLnJtID0gVFJVRQogICkKc2VyaW5lc3luX3N1bW1hcnlfZGF0YQpgYGAKCiMjIyMgR2VuZXJhdGUgdGhlIGJhciBwbG90CgpOb3cgd2Ugc2V0dXAgdGhlIHBsb3R0aW5nIHBhcmFtZXRlcnMuCmBgYHtyLCBmaWcud2lkdGg9MTR9CiMgU2V0dXAgdGhlIHBsb3QKcCA8LSBnZ3Bsb3QoCiAgZGF0YSA9IHNlcmluZXN5bl9zdW1tYXJ5X2RhdGEsCiAgYWVzKHggPSBgVGlzc3VlYCwgeSA9IGBOb3JtYWxpemVkIExhYmVsaW5nYCwgZmlsbCA9IGBGZWVkaW5nIFN0YXR1c2ApCikgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX2Vycm9yYmFyKGFlcygKICAgIHltaW4gPSBgTm9ybWFsaXplZCBMYWJlbGluZ2AgLSBzZCwKICAgIHltYXggPSBgTm9ybWFsaXplZCBMYWJlbGluZ2AgKyBzZAogICksCiAgd2lkdGggPSAuMiwKICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSkKICApICsKICB0aGVtZV9ncmF5KGJhc2Vfc2l6ZSA9IDIyKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIHZqdXN0ID0gMC41LCBoanVzdCA9IDApKSArCiAgZ2d0aXRsZSgiTm9ybWFsaXplZCBMYWJlbGluZyBvZiBTZXJpbmUgd2l0aCBHbHVjb3NlIFRyYWNlciIsCiAgICBzdWJ0aXRsZSA9ICJTZXJpbmUgU3ludGhlc2lzIFN0dWR5IgogICkKCiMgRGlzcGxheSB0aGUgcGxvdApwCmBgYAoKIyMgU2VyaW5lIExhYmVsaW5nIGZyb20gTXVsdGlwbGUgU3R1ZGllcwoKIyMjIExvYWQgUGVha0dyb3VwIGRhdGEKClRoZSBQZWFrR3JvdXAgZGF0YSB3YXMgZG93bmxvYWRlZCBmcm9tIFRyYWNlQmFzZSBieSBzZWFyY2hpbmcgd2l0aDoKKiBPdXRwdXQgRm9ybWF0ID09ICJQZWFrR3JvdXBzIgoqIE1lc3VyZWQgQ29tcG91bmQgPT0gInNlcmluZSIKKiBUcmFjZXIgQ29tcG91bmQgPT0gImdsdWNvc2UiCgohW1RyYWNlQmFzZSBTZXJpbmUgUGVha0dyb3VwcyB3aXRoIEdsdWNvc2UgVHJhY2VyXSh0cmFjZWJhc2Vfc2VyaW5lX3BlYWtncm91cHNfZ2x1Y29zZV90cmFjZXJfc2VhcmNoLnBuZykKCmBgYHtyfQphbGxfc2VyaW5lX3BlYWtncm91cF90YWJsZSA8LQogICJkYXRhL1BlYWtHcm91cHMtc2VyaW5lLWFsbC1zdHVkaWVzMTAuMDIuMjAyMy4xNi4yMS41MC50c3YiCmFsbF9zZXJpbmVfcGVha2dyb3VwX2RhdGEgPC0KICByZWFkcjo6cmVhZF90c3YoYWxsX3NlcmluZV9wZWFrZ3JvdXBfdGFibGUsIGNvbW1lbnQgPSAiIyIsIG5hID0gYygiTm9uZSIpKQphbGxfc2VyaW5lX3BlYWtncm91cF9kYXRhCmBgYAoKIyMjIFBsb3QgTm9ybWFsaXplZCBMYWJlbGluZyBvZiBHbHVjb3NlIChub3QgTWFsYXRlKSBieSBGZWVkaW5nIFN0YXR1cyBwZXIgVGlzc3VlCgpGb3IgdGhpcyBleGFtcGxlLCB3ZSBhcmUgZ29pbmcgdG8gcGxvdCB0aGUgIk5vcm1hbGl6ZWQgTGFiZWxpbmciIG9mIEdsdWNvc2UgKG5vdCBNYWxhdGUpLCBmb3IgdGlzc3VlLCBzcGxpdCBieSAiRmVlZGluZyBTdGF0dXMiLgoKIyMjIyBTZWxlY3QgZGF0YQoKU2VsZWN0IHRob3NlIHJvd3MgdGhhdCB1c2VkIGEgYGdsdWNvc2VgIHRyYWNlciBhbmQgbWVhc3VyZWQgYHNlcmluZWAgZm9yIGFuaW1hbHMgaW4gdGhlIGBmYXN0ZWRgIHN0YXRlLgpgYGB7cn0KYWxsX3NlcmluZV9wbG90X2RhdGEgPC0gYWxsX3NlcmluZV9wZWFrZ3JvdXBfZGF0YSAlPiUKICBmaWx0ZXIoCiAgICBzdHJfZGV0ZWN0KGBJbmZ1c2F0ZWAsICJnbHVjb3NlLSIpLAogICAgYE1lYXN1cmVkIENvbXBvdW5kKHMpYCA9PSAic2VyaW5lIiwKICAgIGBGZWVkaW5nIFN0YXR1c2AgPT0gImZhc3RlZCIKICApCmFsbF9zZXJpbmVfcGxvdF9kYXRhCmBgYAoKIyMjIyBDYWxjdWxhdGUgc3VtbWFyeSBzdGF0aXN0aWNzCgpXZSB1c2UgdGhlIGBzdW1tYXJ5U0VgIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgc3RhbmRhcmQgZXJyb3IgZm9yIGVhY2ggZ3JvdXAuCmBgYHtyfQphbGxfc2VyaW5lX3N1bW1hcnlfZGF0YSA8LQogICMgQ2FsY3VsYXRlIHN1bW1hcnkgc3RhdGlzdGljcyBmb3IgZWFjaCBzdHVkeS90aXNzdWUgZ3JvdXAKICBhbGxfc2VyaW5lX3Bsb3RfZGF0YSAlPiUKICBSbWlzYzo6c3VtbWFyeVNFKAogICAgbWVhc3VyZXZhciA9ICJOb3JtYWxpemVkIExhYmVsaW5nIiwKICAgIGdyb3VwdmFycyA9IGMoIlN0dWRpZXMiLCAiVGlzc3VlIiksCiAgICBuYS5ybSA9IFRSVUUKICApICU+JQogICMgUGxvdCBvbmx5IHRpc3N1ZXMgd2l0aCBkYXRhIGluIGFsbCBmb3VyIFN0dWRpZXMKICBncm91cF9ieShUaXNzdWUpICU+JQogIGZpbHRlcihsZW5ndGgodW5pcXVlKFN0dWRpZXMpKSA+PSA0KSAlPiUKICAjIFJlbmFtZSBzb21lIHN0dWRpZXMKICBtdXRhdGUoU3R1ZGllcyA9IHJlY29kZShTdHVkaWVzLAogICAgImZsdXhvbWljcyAyMDIwIiA9ICJGbHV4b21pY3MgMjAyMCIsCiAgICAiU2VyaW5lIHN5bnRoZXNpcyBmcm9tIGdsdWNvc2UgaW4gY29udHJvbCB2cyBzZXIvZ2x5LWZyZWUgZGlldCIgPQogICAgICAiU2VyaW5lIHN5bnRoZXNpcyIKICApKQphbGxfc2VyaW5lX3N1bW1hcnlfZGF0YQpgYGAKCiMjIyMgR2VuZXJhdGUgdGhlIGJhciBwbG90CgpOb3cgd2Ugc2V0dXAgdGhlIHBsb3R0aW5nIHBhcmFtZXRlcnMuCmBgYHtyLCBmaWcud2lkdGg9MTR9CiMgU2V0dXAgdGhlIHBsb3QKYWxsX3NlcmluZV9wbG90IDwtIGdncGxvdCgKICBkYXRhID0gYWxsX3NlcmluZV9zdW1tYXJ5X2RhdGEsCiAgYWVzKHggPSBgVGlzc3VlYCwgeSA9IGBOb3JtYWxpemVkIExhYmVsaW5nYCwgZmlsbCA9IGBTdHVkaWVzYCkKKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKwogIGdlb21fZXJyb3JiYXIoYWVzKAogICAgeW1pbiA9IGBOb3JtYWxpemVkIExhYmVsaW5nYCAtIHNkLAogICAgeW1heCA9IGBOb3JtYWxpemVkIExhYmVsaW5nYCArIHNkCiAgKSwKICB3aWR0aCA9IC4yLAogIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KQogICkgKwogIHRoZW1lX2dyYXkoYmFzZV9zaXplID0gMjIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IC00NSwgdmp1c3QgPSAwLjUsIGhqdXN0ID0gMCkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogICMgc2NhbGVfZmlsbF9kaXNjcmV0ZShsYWJlbHM9YygiRmx1eG9taWNzIDIwMjAiLCAiU2VyaW5lIFN5bnRoZXNpcyIpKSArCiAgZ2d0aXRsZSgiTm9ybWFsaXplZCBMYWJlbGluZyBvZiBTZXJpbmUgd2l0aCBHbHVjb3NlIFRyYWNlciIsCiAgICBzdWJ0aXRsZSA9ICJBbmltYWxzIGluIEZhc3RlZCBTdGF0ZSIKICApCgojIERpc3BsYXkgdGhlIHBsb3QKYWxsX3NlcmluZV9wbG90CmBgYAo=