(Acest articol a fost publicat pentru prima dată pe RSTATS – Cantificatși a contribuit cu drag la R-Bloggers). (Puteți raporta problema despre conținutul de pe această pagină aici)
Doriți să vă împărtășiți conținutul pe R-Bloggers? Faceți clic aici dacă aveți un blog sau aici dacă nu.
Este timpul de recreere a complotului! În această postare, vom analiza cum putem recrea un complot în R. Am crezut că ar putea fi util să oferim soluția, dar și să detaliem procesul prin care am trecut pentru a ajunge acolo.
Avem un complot FACS preluat dintr -o mașină BD FACS ARIA:

Pe scurt, este o histogramă a nivelurilor de fluorescență a 10000 de celule din trei surse diferite. Fluorescența este excitată de un laser de 488 nm și este colectată la 515-545 nm, adică fluorescența verde.
De ce trebuie să recreăm complotul?
Acest complot a fost în informațiile suplimentare ale preprintului nostru (Fig S2).
https://doi.org/10.1101/2024.05.31.596797
Jurnalul necesită ca toate datele numerice din parcele să fie puse la dispoziție. Întrucât complotul a fost generat în software la care nu am avut acces, a trebuit să fie recreat din datele brute și apoi datele numerice ar putea fi puse la dispoziție.
Ce trebuie să facem pentru a -l recrea?
Doar uitându -ne la complot, ce dificultăți anticipăm?
- Este o histogramă pe scară de jurnal – deci dimensiunile coșului ar putea fi problematice
- Trebuie să facem reprezentare și completare a liniei – nu știu cum să fac asta
- Avem datele brute, dar va trebui să verificăm numărul – este totul reprezentat sau doar unele?
Procesul
Puteți sări peste rezultatul final dacă doriți doar să știți cum să generați un complot ca acesta.
Dacă doriți să codificați, datele sunt disponibile aici.
Mai întâi vom folosi pachetul bioconductor {flowCore}
a încărca în brut .fcs
fișiere.
# if (!require("BiocManager", quietly = TRUE)) # install.packages("BiocManager") # BiocManager::install("flowCore") # BiocManager::install("flowWorkspace") # BiocManager::install("ggcyto") library(flowCore) library(flowWorkspace) library(ggplot2) library(ggcyto) library(data.table) library(dplyr) library(cowplot) # list the fcs files and read them into a flowSet fcs_files <- list.files(path = "Data",pattern = ".fcs", full.names = TRUE) fs <- read.flowSet(files = unlist(fcs_files)) # wrangle the flowSet into a data frame tflow <- fsApply(fs, exprs, simplify = F) tflow <- lapply(tflow, as.data.frame) tflow <- rbindlist(tflow, idcol = "file") tflow <- as.data.frame(tflow) # filter for "clon 5" "pool" and "negative" the three cell sources we're interested in tflow <- tflow %>% filter(grepl("clon 5", file) | grepl("pool", file) | grepl("negative", file))
Putem vedea că acest cadru de date este de 30000 de rânduri și că fiecare fișier avea 10000 de rânduri (dacă arătăm puțin mai aproape), ceea ce înseamnă că toate datele au fost reprezentate inițial. Trebuie doar să trasăm singuri datele. O preocupare a verificat lista.
În ceea ce privește datele, pentru a face complotul, avem nevoie doar de B488-530_30-A
coloana valorilor numerice și a file
coloană care indică sursa celulei.
Acum să avem o primă trecere la un complot.
# ggplot of "B488-530_30-A" as histogram on a logicle scale ggplot(tflow, aes(x = `B488-530/30-A`, colour = file)) + geom_density() + scale_x_logicle() + labs(x = "B488-530_30-A", y = "Count") + theme_cowplot(9) ggsave("Output/Plots/plot1.png", width = 8, height = 4, dpi = 300, bg = "white")


Forma datelor pare aproximativ corectă. Am folosit geom_density()
Pentru a obține un profil de linie, dar este prea neted pentru a genera complotul de care avem nevoie. Am folosit scala „logic” din {ggcyto}
Dar avem nevoie doar de o scară de jurnal obișnuită.
Să trecem la o histogramă:
# ggplot of "B488-530_30-A" as histogram on a log scale ggplot(tflow, aes(x = `B488-530/30-A`, colour = file)) + geom_histogram() + scale_x_log10() + labs(x = "B488-530_30-A", y = "Count") + theme_cowplot(9) ggsave("Output/Plots/plot2.png", width = 8, height = 4, dpi = 300, bg = "white")


Primul lucru este că GGPLOT înțelege că scalarea axei X înseamnă că coșurile de histogramă trebuie să fie scalate. Cu toate acestea, această comandă generează unele mesaje de eroare din cauza transformării; probabil din cauza 0 valori din date.
Ideea GGPLOT este de a lăsa pachetul să facă toată munca, dar uneori este mai bine să perfecționăm ceea ce intră. Așa că vom transforma valorile manual. Putem apoi să trasăm valorile transformate și să sortăm etichetarea axei X Leter. În timp ce suntem la ea, să folosim și culorile din complotul FACS ARIA.
# log transform B488-530/30-A to get a plot like FACSAria tflow$trans <- log10(tflow$`B488-530/30-A` + 1) # colours from the FACSAria output my_colours <- c(rgb(2, 85, 170, maxColorValue = 255), rgb(255, 51, 52, maxColorValue = 255), rgb(131, 130, 1, maxColorValue = 255)) # plot and refine ggplot(tflow, aes(x = trans, colour = file)) + geom_histogram(fill = "white") + scale_colour_manual(values = my_colours) + labs(x = "B488-530_30-A", y = "Count") + theme_cowplot(9) ggsave("Output/Plots/plot3.png", width = 8, height = 4, dpi = 300, bg = "white") ggplot(tflow, aes(x = trans, colour = file)) + geom_histogram(binwidth = 0.1, fill = "white") + scale_colour_manual(values = my_colours) + labs(x = "B488-530_30-A", y = "Count") + theme_cowplot(9) ggsave("Output/Plots/plot4.png", width = 8, height = 4, dpi = 300, bg = "white") ggplot(tflow, aes(x = trans, colour = file)) + geom_histogram(binwidth = 0.01, fill = "white") + scale_colour_manual(values = my_colours) + labs(x = "B488-530_30-A", y = "Count") + theme_cowplot(9) ggsave("Output/Plots/plot5.png", width = 8, height = 4, dpi = 300, bg = "white") ggplot(tflow, aes(x = trans, colour = file)) + geom_histogram(binwidth = 0.01, position = "identity", fill = "white") + scale_colour_manual(values = my_colours) + labs(x = "B488-530_30-A", y = "Count") + theme_cowplot(9) ggsave("Output/Plots/plot6.png", width = 8, height = 4, dpi = 300, bg = "white") ggplot(tflow, aes(x = trans, colour = file)) + geom_histogram(binwidth = 0.02, position = "identity", fill = "white") + scale_colour_manual(values = my_colours) + labs(x = "B488-530_30-A", y = "Count") + theme_cowplot(9) ggsave("Output/Plots/plot7.png", width = 8, height = 4, dpi = 300, bg = "white")










Prin variația lățimii de bin (ținând cont de faptul că aceasta este în unități transformate), ne putem apropia de aspectul complotului original. Folosind position = "identity"
înseamnă că pierdem comportamentul implicit „histogramă stivuită”, iar numărul este aproape de original, ceea ce ne spune că lățimea de bin este rafinată. Axa este încă borked, dar vom rezolva asta mai târziu.
Trebuie să scăpăm de granițele fiecărei coșuri din histogramă, dar avem nevoie de linia de sus. Putem obține acest efect folosind geom_step
ceea ce oferă un complot peisaj urban și combină asta cu geom_histogram
pentru a face numai umplutura.
# try to lose the histogram look ggplot(tflow, aes(x = trans, colour = file, fill = file)) + geom_histogram(binwidth = 0.02, position = "identity", colour = NA, alpha = 0.3) + scale_fill_manual(values = my_colours) + labs(x = "B488-530_30-A", y = "Count") + theme_cowplot(9) ggsave("Output/Plots/plot8.png", width = 8, height = 4, dpi = 300, bg = "white") ggplot(tflow, aes(x = trans, colour = file, fill = file)) + geom_step(stat = "bin", binwidth = 0.02, direction = "mid") + geom_histogram(binwidth = 0.02, position = "identity", colour = NA, alpha = 0.3) + scale_fill_manual(values = my_colours) + scale_colour_manual(values = my_colours) + labs(x = "B488-530_30-A", y = "Count") + theme_cowplot(9) ggsave("Output/Plots/plot9.png", width = 8, height = 4, dpi = 300, bg = "white")




Acest lucru este aproape… dar totuși are aspectul „blocant”. Deci acesta este sfârșitul liniei pentru această abordare. Trebuie să schimbăm abordarea.
Privind manualul Tidyverse pentru geom_step „Observații de conectare”, pot vedea că Geom_line face parte din aceeași familie. Deci, să facem asta:
# use geom_line ggplot(tflow, aes(x = trans, colour = file, fill = file)) + geom_line(stat = "bin", binwidth = 0.02, direction = "mid") + geom_histogram(binwidth = 0.02, position = "identity", colour = NA, alpha = 0.3) + labs(x = "B488-530_30-A", y = "Count") + scale_colour_manual(values = my_colours) + scale_fill_manual(values = my_colours) + theme_cowplot(9) ggsave("Output/Plots/plot10.png", width = 8, height = 4, dpi = 300, bg = "white") # use geom_area ggplot(tflow, aes(x = trans, colour = file, fill = file)) + geom_line(stat = "bin", binwidth = 0.02, direction = "mid") + geom_area(stat = "bin", binwidth = 0.02, position = "identity", colour = NA, alpha = 0.3) + labs(x = "B488-530_30-A", y = "Count") + scale_colour_manual(values = my_colours) + scale_fill_manual(values = my_colours) + theme_cowplot(9) ggsave("Output/Plots/plot11.png", width = 8, height = 4, dpi = 300, bg = "white") # tweak binwidth to match original ggplot(tflow, aes(x = trans, colour = file, fill = file)) + geom_line(stat = "bin", binwidth = 0.018, direction = "mid") + geom_area(stat = "bin", binwidth = 0.018, position = "identity", colour = NA, alpha = 0.3) + labs(x = "B488-530_30-A", y = "Count") + scale_colour_manual(values = my_colours) + scale_fill_manual(values = my_colours) + theme_cowplot(9) ggsave("Output/Plots/plot12.png", width = 8, height = 4, dpi = 300, bg = "white") # now fix the axis ggplot(tflow, aes(x = trans, colour = file, fill = file)) + geom_line(stat = "bin", binwidth = 0.018, direction = "mid") + geom_area(stat = "bin", binwidth = 0.018, position = "identity", colour = NA, alpha = 0.3) + labs(x = "B488-530_30-A", y = "Count") + scale_x_continuous(limits = c(0.6,5), labels = scales::label_math(10^.x)) + scale_colour_manual(values = my_colours) + scale_fill_manual(values = my_colours) + theme_cowplot(9) + annotation_logticks(sides = "b") ggsave("Output/Plots/plot13.png", width = 8, height = 4, dpi = 300, bg = "white")








Înlocuire geom_step
cu geom_line
a lucrat imediat. Înlocuire geom_histogram
cu geom_area
Înseamnă că obținem efectul frumos de umplere și, în sfârșit, scăpăm de aspectul blocant. De asemenea, am modificat lățimea de bin pentru a se potrivi cu originalul și am rezolvat în cele din urmă axa.
Pentru a -l face mai prezentabil, vom schimba culorile (din moment ce nu aveau prea mult sens în complotul original). Vom muta legenda în interiorul complotului doar pentru a face scalarea ulterioară mai ușor de introdus în figură.
# the original colours weren't great, so my_colours <- c("#00a651", "#3f3f3f", "#2276b9") # plot the log transformed data as a histogram with binwidth of 0.018 ggplot(tflow, aes(x = trans, colour = file, fill = file)) + geom_line(stat = "bin", binwidth = 0.018, direction = "mid") + geom_area(stat = "bin", binwidth = 0.018, position = "identity", colour = NA, alpha = 0.3) + # geom_histogram(binwidth = 0.018, position = "identity", colour = NA, alpha = 0.3) + labs(x = "B488-530_30-A", y = "Count") + scale_x_continuous(limits = c(0.6,5), labels = scales::label_math(10^.x)) + scale_colour_manual(values = my_colours) + scale_fill_manual(values = my_colours) + theme_cowplot(9) + # place legend inside the plot, top left theme(legend.position = c(0.1, 0.9), legend.background = element_rect(fill = "transparent"), legend.key = element_rect(fill = "transparent", colour = "transparent")) + annotation_logticks(sides = "b") # save the plot ggsave("Output/Plots/plot14.png", width = 8, height = 4, dpi = 300, bg = "white")


De aici putem exporta la dimensiunea corectă și o putem introduce în figură.
ggsave("Output/Plots/plot15.png", last_plot() + theme(legend.position = "none"), width = 58, height = 58, dpi = 300, bg = "white", units = "mm")


În cele din urmă, dacă vă amintiți, jurnalul a dorit datele numerice. Îl putem salva astfel:
## Export results ---- # if Output/Data directory does not exist, create it if (!dir.exists("Output/Data")) { dir.create("Output/Data", recursive = TRUE) } # extract Protein and IntDen columns to a new dataframe and save as csv results <- tflow %>% select(file, `B488-530/30-A`, trans) %>% mutate(file = gsub(".fcs", "", file)) %>% mutate(file = gsub("Specimen_001_", "", file)) write.csv(results, "Output/Data/S2B.csv", row.names = FALSE)
Cum am făcut?
Cu riscul de a „marca propriile mele teme”, să vedem cum am făcut -o.
- Am verificat conducta brută de date la complot și am produs datele numerice cerute de Jurnal
- Am produs un complot care este în același stil ca originalul:
- Scara axei y și forma liniilor este similară
- Am obținut același aspect cu Geom_line și Geom_Area
- Scalarea axei X este corectă
- Scopul era să nu reproducă exact complotul:
- Am îmbunătățit schema de culori
- Căpușele axei X se confruntă cu un mod greșit (cred că acest lucru se datorează faptului că căpușele externe sunt tăiate de
{cowplot}
) - Fără căpușe minore de axa y
- Fără cutie sau axe oglindite
- Legenda va avea nevoie de modificare mai târziu în figură




–
Titlul Post provine de la „Let It Flow” de Spiritualized, preluat din albumul lor de fază pură.