Zhou, Y., Song, W.M., Andhey, P.S., Swain, A., Levy, T., Miller, K.R., Poliani, P.L., Cominelli, M., Grover, S., Gilfillan, S., et al. (2020). Human and mouse single-nucleus transcriptomics reveal TREM2-dependent and TREM2-independent cellular responses in Alzheimer’s disease. Nat. Med. 26, 131–142.
Load required packages.
library(tidyverse)
library(magrittr)
library(Matrix)
library(extrafont)
library(ggrepel)
library(patchwork)
# library(tidylog)Sys.time()## [1] "2020-12-17 19:25:41 CST"
source(
    file = file.path(
        SCRIPT_DIR,
        "utilities.R"
    )
)
load_matrix <- function(x) {
    matrix_readcount_use <- scipy.sparse$load_npz(
        file.path(x, "matrix_readcount.npz")
    )
    colnames(matrix_readcount_use) <- np$load(
        file.path(x, "matrix_readcount_barcodes.npy")
    )
    rownames(matrix_readcount_use) <- np$load(
        file.path(x, "matrix_readcount_features.npy")
    )
    return(matrix_readcount_use)
}PROJECT_DIR <- "/Users/jialei/Dropbox/Data/Projects/UTSW/Collaborations/Microglia/raw/public/PRJNA590042/remapped"np <- reticulate::import("numpy", convert = TRUE)
scipy.sparse <- reticulate::import(module = "scipy.sparse", convert = TRUE)
matrix_dir <- list(
    "matrices"
)
matrix_readcount_use <- purrr::map(matrix_dir, function(x) {
    load_matrix(file.path(PROJECT_DIR, x))
}) %>%
    purrr::reduce(cbind)
walk(list(matrix_readcount_use, matrix_dir), function(x) {
    print(object.size(x), units = "auto", standard = "SI")
})## 3.4 GB
## 176 B
# clean up
rm(matrix_dir)EMBEDDING_FILE <- "embedding_ncomponents35_ccc1_seed20200416.csv.gz"
embedding <- read_csv(
    file = file.path(
        PROJECT_DIR,
        "clustering",
        "exploring",
        EMBEDDING_FILE
    )
)
# clean up
rm(EMBEDDING_FILE)cell_metadata_PRJNA590042 <- read_delim(
    file.path(
        PROJECT_DIR,
        "raw/",
        "SraRunTable.csv"
    ),
    delim = ","
) %>%
    select(
        run = Run,
        age = Age,
        sample_name = `Sample Name`,
        mouse_genotype,
        source_name
    )
embedding %<>%
    left_join(
        cell_metadata_PRJNA590042 %>%
            select(sample_name, genotype = mouse_genotype),
        by = c("batch" = "sample_name")
    ) %>%
    mutate(
        genotype = factor(
            genotype,
            levels = c("wt", "5XFAD", "Trem2-/-", "Trem2-/- 5XFAD")
        ) %>% fct_recode(WT = "wt")
    )
cell_metadata_PRJNA590042embedding %>%
    mutate(
        num_umis = colSums(matrix_readcount_use[, cell]),
        num_genes = colSums(matrix_readcount_use[, cell] > 0)
    ) %>%
    group_by(louvain) %>%
    summarise(
        num_cells = n(),
        median_umis = median(num_umis),
        median_genes = median(num_genes)
    ) %>%
    gt::gt() %>%
    gt::tab_options(table.font.size = "median")## `summarise()` has ungrouped output. You can override using the `.groups` argument.
| louvain | num_cells | median_umis | median_genes | 
|---|---|---|---|
| 0 | 8953 | 2509.0 | 1439.0 | 
| 1 | 7856 | 14239.0 | 4261.0 | 
| 2 | 6987 | 13770.0 | 4518.0 | 
| 3 | 6372 | 11030.0 | 3962.5 | 
| 4 | 6252 | 13780.0 | 4370.0 | 
| 5 | 5856 | 701.5 | 547.0 | 
| 6 | 5070 | 18558.5 | 5025.0 | 
| 7 | 5029 | 16350.0 | 4841.0 | 
| 8 | 4479 | 3236.0 | 1718.0 | 
| 9 | 3972 | 731.0 | 538.0 | 
| 10 | 3906 | 4403.0 | 2246.0 | 
| 11 | 3696 | 2704.0 | 1721.0 | 
| 12 | 2964 | 11285.0 | 4214.5 | 
| 13 | 2484 | 12135.5 | 4364.5 | 
| 14 | 2316 | 8534.5 | 3514.5 | 
| 15 | 2215 | 5280.0 | 2586.0 | 
| 16 | 1752 | 23367.5 | 5638.0 | 
| 17 | 1740 | 10955.5 | 4105.5 | 
| 18 | 1610 | 6057.5 | 2650.0 | 
| 19 | 996 | 7048.0 | 3065.0 | 
| 20 | 906 | 10770.5 | 3921.5 | 
| 21 | 814 | 5551.0 | 2565.0 | 
| 22 | 682 | 16883.5 | 4925.0 | 
| 23 | 584 | 1835.0 | 1225.5 | 
| 24 | 537 | 884.0 | 640.0 | 
| 25 | 528 | 2872.0 | 1742.0 | 
| 26 | 474 | 3503.0 | 2050.5 | 
| 27 | 312 | 4221.5 | 2078.0 | 
| 28 | 238 | 2310.5 | 1524.5 | 
| 29 | 134 | 13254.0 | 4724.0 | 
| 30 | 112 | 5206.0 | 2697.0 | 
| 31 | 47 | 9194.0 | 3847.0 | 
embedding %>%
    mutate(
        num_umis = colSums(matrix_readcount_use[, cell]),
        num_genes = colSums(matrix_readcount_use[, cell] > 0)
    ) %>%
    group_by(genotype) %>%
    summarise(
        num_cells = n(),
        median_umis = median(num_umis),
        median_genes = median(num_genes)
    ) %>%
    gt::gt() %>%
    gt::tab_options(table.font.size = "median")## `summarise()` has ungrouped output. You can override using the `.groups` argument.
| genotype | num_cells | median_umis | median_genes | 
|---|---|---|---|
| WT | 24034 | 7677.0 | 3313.5 | 
| 5XFAD | 22069 | 5824.0 | 2633.0 | 
| Trem2-/- | 22884 | 7802.0 | 3325.0 | 
| Trem2-/- 5XFAD | 20886 | 8696.5 | 3472.5 | 
purrr::map(sort(unique(embedding$louvain)), function(x) {
    cells_in_group <- embedding %>%
        filter(louvain == x) %>%
        pull(cell)
    colSums(matrix_readcount_use[, cells_in_group]) %>%
        enframe(name = "cell") %>%
        mutate(group = x)
}) %>%
    dplyr::bind_rows() %>%
    mutate(
        group = factor(
            group,
            levels = sort(unique(embedding$louvain)) %>% rev()
        ),
        category = "UMI distribution"
    ) %>%
    plot_violin_umi(
        x = value,
        y = group,
        z = "category"
    ) +
    # match cluster colors
    ggplot2::scale_color_manual(
        values = gg_color_hue(n = length(unique(embedding$louvain))) %>% rev(.)
    ) +
    ggplot2::scale_fill_manual(
        values = gg_color_hue(n = length(unique(embedding$louvain))) %>% rev(.)
    )EMBEDDING_TITLE_PREFIX <- "t-SNE"
x_column <- "x_tsne"
y_column <- "y_tsne"p_embedding_cluster <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = embedding$louvain %>% as.factor(),
    label = paste0(EMBEDDING_TITLE_PREFIX, "; Cluster"),
    label_position = NULL,
    show_color_value_labels = TRUE,
    show_color_legend = FALSE,
    geom_point_size = 0.3,
    sort_values = FALSE
) +
    scale_color_manual(
        values = gg_color_hue(n = length(unique(embedding$louvain)))
    ) +
    # labs(color = NULL) +
    customized_theme()
p_embedding_batch <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = embedding$batch %>% as.factor(),
    label = paste0(EMBEDDING_TITLE_PREFIX, "; Batch"),
    label_position = NULL,
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = 0.15,
    sort_values = FALSE
) +
    scale_color_manual(
        values = gg_color_hue(n = length(unique(embedding$batch)))
    ) +
    guides(colour = guide_legend(override.aes = list(size = 3), ncol = 1)) +
    labs(color = NULL) +
    customized_theme()
CB_POSITION <- c(0.83, 0.275)
p_embedding_umi <- plot_embedding_value(
    embedding = embedding[, c(x_column, y_column)],
    color_values = log10(
        Matrix::colSums(matrix_readcount_use[, embedding$cell]) + 1
    ),
    colorbar_position = CB_POSITION,
    label = paste0(EMBEDDING_TITLE_PREFIX, "; UMI"),
    label_position = NULL,
    geom_point_size = 0.4,
    sort_values = TRUE,
    FUN = function(x) x
)
p_embedding_genotype <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = embedding$genotype,
    label = paste0(EMBEDDING_TITLE_PREFIX, "; Genotype"),
    label_position = NULL,
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = 0.15,
    sort_values = FALSE
) +
    scale_color_manual(
        # values = gg_color_hue(n = length(unique(embedding$genotype)))
        values = yarrr::piratepal(palette = "google") %>% as.character()
    ) +
    guides(colour = guide_legend(override.aes = list(size = 3), ncol = 1)) +
    labs(color = NULL) +
    customized_theme()Fig.1b
list(
    p_embedding_cluster,
    p_embedding_umi,
    p_embedding_genotype,
    p_embedding_batch
) %>%
    purrr::reduce(`+`) +
    patchwork::plot_layout(ncol = 2) +
    patchwork::plot_annotation(
        theme = theme(plot.margin = margin())
    )purrr::map(sort(unique(embedding$batch)), function(x) {
    plot_embedding(
        embedding = embedding[, c(x_column, y_column)],
        color_values = as.numeric(embedding$batch == x) %>% as.factor(),
        label = paste0(EMBEDDING_TITLE_PREFIX, "; ", x),
        label_position = NULL,
        show_color_value_labels = FALSE,
        show_color_legend = FALSE,
        geom_point_size = 0.18,
        sort_values = TRUE
    ) +
        scale_color_manual(
            values = c("grey70", "salmon")
        )
}) %>%
    purrr::reduce(`+`) +
    plot_layout(ncol = 3) +
    plot_annotation(
        theme = theme(plot.margin = margin())
    )matrix_cpm_use <- calc_cpm(matrix_readcount_use)
walk(list(matrix_cpm_use), function(x) {
    print(object.size(x), units = "auto", standard = "SI")
})
# clean up
gc()## 3.4 GB
##             used   (Mb) gc trigger    (Mb) limit (Mb)   max used    (Mb)
## Ncells   3176585  169.7    6132278   327.5         NA    4144918   221.4
## Vcells 728736863 5559.9 1490893404 11374.7      16384 1464604784 11174.1
FEATURES_SELECTED <- c(
    "ENSMUSG00000024621_Csf1r",
    "ENSMUSG00000052336_Cx3cr1",
    "ENSMUSG00000036353_P2ry12",
    "ENSMUSG00000036887_C1qa"
)
purrr::map(FEATURES_SELECTED, function(x) {
    selected_feature <- x
    plot_embedding_value(
        embedding = embedding[, c(x_column, y_column)],
        color_values = log10(
            matrix_cpm_use[selected_feature, embedding$cell] + 1
        ),
        colorbar_position = CB_POSITION,
        label = paste0(EMBEDDING_TITLE_PREFIX, "; ", x),
        # label_position = c(x_label, y_label),
        geom_point_size = 0.4,
        sort_values = TRUE,
        FUN = function(x) x
    )
}) %>%
    purrr::reduce(`+`) +
    plot_layout(nrow = 2) +
    plot_annotation(theme = theme(plot.margin = margin()))grep(pattern = "itm2a", x = rownames(matrix_cpm_use), ignore.case = TRUE, value = TRUE)
FEATURES_SELECTED <- c(
    # Pan-neuronal
    "ENSMUSG00000026959_Grin1",
    "ENSMUSG00000025576_Rbfox3",
    # Excitatory neuron
    "ENSMUSG00000070570_Slc17a7",
    "ENSMUSG00000038331_Satb2",
    # Astrocyte
    "ENSMUSG00000024411_Aqp4",
    "ENSMUSG00000050953_Gja1",
    # Oligodendrocyte
    "ENSMUSG00000076439_Mog",
    "ENSMUSG00000037625_Cldn11",
    # OPC
    "ENSMUSG00000029231_Pdgfra",
    "ENSMUSG00000021614_Vcan",
    # Endothelial cell
    "ENSMUSG00000017344_Vtn",
    "ENSMUSG00000031239_Itm2a"
)
FEATURES_SELECTED_ANNOTATION <- c(
    "Pan-neuronal", "Excitatory neuron", "Astrocyte",
    "Oligodendrocyte", "OPC", "Endothelial cell"
) %>%
    rep(each = 2)## [1] "ENSMUSG00000031239_Itm2a"
 ED Fig.1b
# cell type specific markers
purrr::map2(FEATURES_SELECTED, FEATURES_SELECTED_ANNOTATION, function(x, y) {
    selected_feature <- x
    plot_embedding_value(
        embedding = embedding[, c(x_column, y_column)],
        color_values = log10(
            matrix_cpm_use[selected_feature, embedding$cell] + 1
        ),
        colorbar_position = CB_POSITION,
        label = paste(
            paste0(EMBEDDING_TITLE_PREFIX, "; ", x %>% str_remove("^E.+_")),
            y,
            sep = "; "
        ),
        # label_position = c(x_label, y_label),
        geom_point_size = 0.4,
        sort_values = TRUE,
        FUN = function(x) x
    )
}) %>%
    purrr::reduce(`+`) +
    plot_layout(ncol = 2) +
    plot_annotation(theme = theme(plot.margin = margin()))
 ED Fig.1b
# Inhibitory neuron
FEATURES_SELECTED <- c(
    "ENSMUSG00000026837_Col5a1",
    "ENSMUSG00000070880_Gad1",
    "ENSMUSG00000061762_Tac1",
    "ENSMUSG00000004366_Sst",
    "ENSMUSG00000041592_Sdk2",
    "ENSMUSG00000026787_Gad2",
    "ENSMUSG00000045573_Penk",
    "ENSMUSG00000029819_Npy"
)
purrr::map(FEATURES_SELECTED, function(x) {
    selected_feature <- x
    plot_embedding_value(
        embedding = embedding[, c(x_column, y_column)],
        color_values = log10(
            matrix_cpm_use[selected_feature, embedding$cell] + 1
        ),
        colorbar_position = CB_POSITION,
        label = paste(
            EMBEDDING_TITLE_PREFIX,
            x %>% str_remove("^E.+_"),
            "Inhibitory neuron",
            sep = "; "
        ),
        # label_position = c(x_label, y_label),
        geom_point_size = 0.4,
        sort_values = TRUE,
        FUN = function(x) x
    )
}) %>%
    purrr::reduce(`+`) +
    plot_layout(ncol = 2) +
    plot_annotation(theme = theme(plot.margin = margin()))clusters_selected_lollipop <- sort(unique(embedding$louvain))
cells_selected_lollipop <- lapply(clusters_selected_lollipop, function(x) {
    embedding$cell[embedding$louvain == x]
})
names(cells_selected_lollipop) <- clusters_selected_lollipop
FEATURES_LOLLIPOP <- c(
    "ENSMUSG00000026959_Grin1",
    "ENSMUSG00000035864_Syt1",
    "ENSMUSG00000025576_Rbfox3",
    "ENSMUSG00000027273_Snap25",
    "ENSMUSG00000059003_Grin2a",
    "ENSMUSG00000070570_Slc17a7",
    "ENSMUSG00000038331_Satb2",
    "ENSMUSG00000070880_Gad1",
    "ENSMUSG00000026787_Gad2",
    "ENSMUSG00000004366_Sst",
    "ENSMUSG00000029819_Npy",
    "ENSMUSG00000031425_Plp1",
    "ENSMUSG00000041607_Mbp",
    "ENSMUSG00000037625_Cldn11",
    "ENSMUSG00000076439_Mog",
    "ENSMUSG00000024617_Camk2a",
    "ENSMUSG00000032532_Cck",
    "ENSMUSG00000033161_Atp1a1",
    "ENSMUSG00000023868_Pde10a",
    "ENSMUSG00000061762_Tac1",
    "ENSMUSG00000045573_Penk",
    "ENSMUSG00000041592_Sdk2",
    "ENSMUSG00000026837_Col5a1",
    "ENSMUSG00000025582_Nptx1",
    "ENSMUSG00000059173_Pde1a",
    "ENSMUSG00000036617_Etl4",
    "ENSMUSG00000005089_Slc1a2",
    "ENSMUSG00000050953_Gja1",
    "ENSMUSG00000024411_Aqp4",
    "ENSMUSG00000021665_Hexb",
    "ENSMUSG00000024621_Csf1r",
    "ENSMUSG00000036887_C1qa",
    "ENSMUSG00000036353_P2ry12",
    "ENSMUSG00000029231_Pdgfra",
    "ENSMUSG00000021614_Vcan",
    "ENSMUSG00000032911_Cspg4",
    "ENSMUSG00000046160_Olig1",
    "ENSMUSG00000017344_Vtn",
    "ENSMUSG00000029648_Flt1",
    "ENSMUSG00000041378_Cldn5"
)
p_dotplot_features_selected <- plot_lollipop(
    cells = cells_selected_lollipop,
    features = FEATURES_LOLLIPOP,
    matrix_cpm = matrix_cpm_use
)p_dotplot_features_selectedFEATURES_VIOLIN <- c(
    "ENSMUSG00000005533_Igf1r",
    "ENSMUSG00000022265_Ank",
    "ENSMUSG00000002985_Apoe",
    "ENSMUSG00000029207_Apbb2",
    "ENSMUSG00000021109_Hif1a",
    "ENSMUSG00000007891_Ctsd",
    "ENSMUSG00000023992_Trem2"
)
plot_violin(
    cells = cells_selected_lollipop,
    features = FEATURES_VIOLIN,
    matrix_cpm = matrix_cpm_use,
    x_range_breaks = NULL
) +
    # match cluster colors
    ggplot2::scale_color_manual(
        values = gg_color_hue(n = length(unique(embedding$louvain))) %>% rev(.)
    ) +
    ggplot2::scale_fill_manual(
        values = gg_color_hue(n = length(unique(embedding$louvain))) %>% rev(.)
    )p_barplot_cluster_composition_batch <- prepare_cluster_composition(
    embedding = embedding,
    x = louvain,
    group = batch
) %>%
    mutate(
        louvain = as.factor(louvain)
    ) %>%
    plot_barplot(
        x = louvain,
        y = percentage,
        z = batch
    )` Fig.1e
p_barplot_cluster_composition_batchp_barplot_cluster_composition_genotype <- prepare_cluster_composition(
    embedding = embedding,
    x = louvain,
    group = genotype
) %>%
    mutate(
        louvain = as.factor(louvain)
    ) %>%
    plot_barplot(
        x = louvain,
        y = percentage,
        z = genotype
    ) +
    scale_fill_manual(
        values = yarrr::piratepal(palette = "google") %>% as.character()
    )p_barplot_cluster_composition_genotypeembedding_microglia <- read_csv(
    file = file.path(
        PROJECT_DIR,
        "clustering",
        "subclustering",
        "exploring",
        "embedding_ncomponents8_ccc1_seed20200416.csv.gz"
    )
) %>%
    left_join(
        cell_metadata_PRJNA590042 %>%
            select(sample_name, genotype = mouse_genotype),
        by = c("batch" = "sample_name")
    ) %>%
    mutate(
        genotype = factor(
            genotype,
            levels = c("wt", "5XFAD", "Trem2-/-", "Trem2-/- 5XFAD")
        ) %>% fct_recode(WT = "wt")
    )## 
## ── Column specification ────────────────────────────────────────────────────────
## cols(
##   cell = col_character(),
##   batch = col_character(),
##   louvain = col_double(),
##   x_tsne = col_double(),
##   y_tsne = col_double(),
##   x_umap = col_double(),
##   y_umap = col_double(),
##   x_fitsne = col_double(),
##   y_fitsne = col_double(),
##   x_phate = col_double(),
##   y_phate = col_double(),
##   `x_min_dist=0.1` = col_double(),
##   `y_min_dist=0.1` = col_double(),
##   x_multicoretsne = col_double(),
##   y_multicoretsne = col_double()
## )
matrix_readcount_use <- matrix_readcount_use[, embedding_microglia$cell]
matrix_cpm_use <- calc_cpm(matrix_readcount_use)
walk(list(matrix_readcount_use, matrix_cpm_use), function(x) {
    print(object.size(x), units = "auto", standard = "SI")
})## 95.5 MB
## 95.5 MB
EMBEDDING_TITLE_PREFIX <- "t-SNE"
x_column <- "x_tsne"
y_column <- "y_tsne"p_embedding_microglia_cluster <- plot_embedding(
    embedding = embedding_microglia[, c(x_column, y_column)],
    color_values = embedding_microglia$louvain %>% as.factor(),
    label = paste0(EMBEDDING_TITLE_PREFIX, "; Cluster"),
    label_position = NULL,
    show_color_value_labels = TRUE,
    show_color_legend = FALSE,
    geom_point_size = 0.6,
    sort_values = FALSE
) +
    scale_color_manual(
        values = ggthemes::tableau_color_pal("Tableau 20")(
            length(unique(embedding_microglia$louvain))
        )
    ) +
    # labs(color = NULL) +
    customized_theme()
p_embedding_microglia_batch <- plot_embedding(
    embedding = embedding_microglia[, c(x_column, y_column)],
    color_values = embedding_microglia$batch %>% as.factor(),
    label = paste0(EMBEDDING_TITLE_PREFIX, "; Batch"),
    label_position = NULL,
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = 0.35,
    sort_values = FALSE
) +
    scale_color_manual(
        values = gg_color_hue(n = length(unique(embedding_microglia$batch)))
    ) +
    guides(colour = guide_legend(override.aes = list(size = 3), ncol = 1)) +
    labs(color = NULL) +
    customized_theme()
CB_POSITION <- c(0.83, 0.275)
p_embedding_microglia_umi <- plot_embedding_value(
    embedding = embedding_microglia[, c(x_column, y_column)],
    color_values = log10(
        Matrix::colSums(matrix_readcount_use[, embedding_microglia$cell]) + 1
    ),
    colorbar_position = CB_POSITION,
    label = paste0(EMBEDDING_TITLE_PREFIX, "; UMI"),
    label_position = NULL,
    geom_point_size = 0.6,
    sort_values = TRUE,
    FUN = function(x) x
)
p_embedding_microglia_genotype <- plot_embedding(
    embedding = embedding_microglia[, c(x_column, y_column)],
    color_values = embedding_microglia$genotype,
    label = paste0(EMBEDDING_TITLE_PREFIX, "; Genotype"),
    label_position = NULL,
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = 0.4,
    sort_values = FALSE
) +
    scale_color_manual(
        # values = gg_color_hue(n = length(unique(embedding$genotype)))
        values = yarrr::piratepal(palette = "google") %>% as.character()
    ) +
    guides(colour = guide_legend(override.aes = list(size = 3), ncol = 1)) +
    labs(color = NULL) +
    customized_theme()Fig.2e
list(
    p_embedding_microglia_cluster,
    p_embedding_microglia_umi,
    p_embedding_microglia_genotype,
    p_embedding_microglia_batch
) %>%
    purrr::reduce(`+`) +
    patchwork::plot_layout(ncol = 2) +
    patchwork::plot_annotation(
        theme = theme(plot.margin = margin())
    )
 Fig.2g
FEATURES_SELECTED <- c(
    "ENSMUSG00000024621_Csf1r",
    "ENSMUSG00000052336_Cx3cr1",
    "ENSMUSG00000036353_P2ry12",
    "ENSMUSG00000036887_C1qa"
)
purrr::map(FEATURES_SELECTED, function(x) {
    selected_feature <- x
    plot_embedding_value(
        embedding = embedding_microglia[, c(x_column, y_column)],
        color_values = log10(
            matrix_cpm_use[selected_feature, embedding_microglia$cell] + 1
        ),
        colorbar_position = CB_POSITION,
        label = paste0(EMBEDDING_TITLE_PREFIX, "; ", x),
        # label_position = c(x_label, y_label),
        geom_point_size = 0.6,
        sort_values = TRUE,
        FUN = function(x) x
    )
}) %>%
    purrr::reduce(`+`) +
    plot_layout(nrow = 2) +
    plot_annotation(theme = theme(plot.margin = margin()))p_barplot_cluster_composition_batch <- prepare_cluster_composition(
    embedding = embedding_microglia,
    x = louvain,
    group = batch
) %>%
    mutate(
        louvain = as.factor(louvain)
    ) %>%
    plot_barplot(
        x = louvain,
        y = percentage,
        z = batch
    )## `summarise()` has ungrouped output. You can override using the `.groups` argument.
## `summarise()` has grouped output by 'louvain'. You can override using the `.groups` argument.
# colorspace::scale_fill_discrete_qualitative(palette = "Dark 3")p_barplot_cluster_composition_batchp_barplot_cluster_composition_genotype <- prepare_cluster_composition(
    embedding = embedding_microglia,
    x = louvain,
    group = genotype
) %>%
    mutate(
        louvain = as.factor(louvain)
    ) %>%
    plot_barplot(
        x = louvain,
        y = percentage,
        z = genotype
    ) +
    scale_fill_manual(
        values = yarrr::piratepal(palette = "google") %>% as.character()
    )p_barplot_cluster_composition_genotypeFig.2f
prepare_cluster_composition(
    embedding = embedding_microglia,
    x = genotype,
    group = louvain
) %>%
    arrange(louvain) %>%
    mutate(
        louvain = factor(louvain),
        genotype = fct_rev(genotype)
    ) %>%
    plot_barplot(x = genotype, y = percentage, z = louvain) +
    coord_flip() +
    scale_fill_manual(
        values = ggthemes::tableau_color_pal("Tableau 20")(
            length(unique(embedding_microglia$louvain))
        )
    )FEATURES_HEATMAP <- c(
    "ENSMUSG00000018126_Baiap2l2",
    "ENSMUSG00000068129_Cst7",
    "ENSMUSG00000014599_Csf1",
    "ENSMUSG00000015568_Lpl",
    # "ENSMUSG00000062593_Lilrb4a",
    "ENSMUSG00000030789_Itgax",
    "ENSMUSG00000005533_Igf1r",
    "ENSMUSG00000000982_Ccl3",
    "ENSMUSG00000050370_Ch25h",
    "ENSMUSG00000022265_Ank",
    "ENSMUSG00000002602_Axl",
    "ENSMUSG00000024610_Cd74",
    "ENSMUSG00000002985_Apoe",
    "ENSMUSG00000069516_Lyz2",
    "ENSMUSG00000029207_Apbb2",
    "ENSMUSG00000021109_Hif1a",
    "ENSMUSG00000018927_Ccl6",
    "ENSMUSG00000029816_Gpnmb",
    "ENSMUSG00000025351_Cd63",
    "ENSMUSG00000073411_H2-D1",
    "ENSMUSG00000007891_Ctsd",
    "ENSMUSG00000023992_Trem2",
    "ENSMUSG00000052336_Cx3cr1",
    "ENSMUSG00000033192_Lpcat2",
    "ENSMUSG00000048163_Selplg",
    "ENSMUSG00000036353_P2ry12",
    "ENSMUSG00000054675_Tmem119",
    "ENSMUSG00000079227_Ccr5",
    "ENSMUSG00000029343_Crybb1"
)
matrix_heatmap <- sapply(sort(unique(embedding_microglia$batch)), function(x) {
    cells_in_group <- embedding_microglia %>%
        filter(batch == x) %>%
        pull(cell)
    Matrix::rowMeans(matrix_cpm_use[FEATURES_HEATMAP, cells_in_group])
})
matrix_heatmap <- log10(matrix_heatmap + 1)
matrix_heatmap <- t(scale(t(matrix_heatmap)))
rownames(matrix_heatmap) <- str_remove(
    string = rownames(matrix_heatmap),
    pattern = "^E.+_"
)
 Fig.2c
ComplexHeatmap::Heatmap(
    matrix = matrix_heatmap,
    col = wesanderson::wes_palette("Zissou1", 100, type = "continuous"),
    rect_gp = grid::gpar(col = "white", lwd = 0.1),
    #
    cluster_rows = TRUE,
    cluster_columns = FALSE,
    #
    row_names_gp = grid::gpar(fontfamily = "Arial", fontsize = 6),
    column_names_gp = grid::gpar(fontfamily = "Arial", fontsize = 6),
    #
    heatmap_legend_param = list(
        title = "Z score",
        title_gp = grid::gpar(
            fontfamily = "Arial",
            fontsize = 6
        ),
        legend_direction = "vertical",
        labels_gp = grid::gpar(
            fontfamily = "Arial",
            fontsize = 5
        ),
        legend_height = unit(20, "mm"),
        legend_width = unit(8, "mm")
    )
    # heatmap_width = unit(8, "cm")
    # heatmap_height = unit(8, "cm")
)devtools::session_info()$platform##  setting  value                       
##  version  R version 4.0.3 (2020-10-10)
##  os       macOS  11.1                 
##  system   x86_64, darwin20.1.0        
##  ui       unknown                     
##  language (EN)                        
##  collate  en_US.UTF-8                 
##  ctype    en_US.UTF-8                 
##  tz       America/Chicago             
##  date     2020-12-17
devtools::session_info()$pack %>%
    as_tibble() %>%
    dplyr::select(
        package,
        loadedversion,
        date,
        `source`
    ) %>%
    gt::gt() %>%
    gt::tab_options(table.font.size = "median")| package | loadedversion | date | source | 
|---|---|---|---|
| assertthat | 0.2.1 | 2019-03-21 | CRAN (R 4.0.0) | 
| backports | 1.2.1 | 2020-12-09 | CRAN (R 4.0.3) | 
| BayesFactor | 0.9.12-4.2 | 2018-05-19 | CRAN (R 4.0.3) | 
| BiocGenerics | 0.36.0 | 2020-10-27 | Bioconductor | 
| broom | 0.7.3.9000 | 2020-12-17 | Github (tidymodels/broom@1c00cc8) | 
| Cairo | 1.5-12.2 | 2020-07-07 | CRAN (R 4.0.3) | 
| callr | 3.5.1.9000 | 2020-11-23 | Github (r-lib/callr@d44e660) | 
| cellranger | 1.1.0 | 2016-07-27 | CRAN (R 4.0.0) | 
| checkmate | 2.0.0 | 2020-02-06 | CRAN (R 4.0.0) | 
| circlize | 0.4.11 | 2020-10-31 | CRAN (R 4.0.3) | 
| cli | 2.2.0 | 2020-11-20 | CRAN (R 4.0.3) | 
| clue | 0.3-58 | 2020-12-03 | CRAN (R 4.0.3) | 
| cluster | 2.1.0 | 2019-06-19 | CRAN (R 4.0.3) | 
| coda | 0.19-4 | 2020-09-30 | CRAN (R 4.0.2) | 
| colorspace | 2.0-0 | 2020-11-10 | R-Forge (R 4.0.3) | 
| ComplexHeatmap | 2.6.2 | 2020-11-12 | Bioconductor | 
| crayon | 1.3.4 | 2017-09-16 | CRAN (R 4.0.0) | 
| DBI | 1.1.0 | 2019-12-15 | CRAN (R 4.0.0) | 
| dbplyr | 2.0.0 | 2020-11-03 | CRAN (R 4.0.3) | 
| desc | 1.2.0 | 2018-05-01 | CRAN (R 4.0.0) | 
| devtools | 2.3.1.9000 | 2020-12-05 | Github (r-lib/devtools@b3be019) | 
| digest | 0.6.27 | 2020-10-24 | CRAN (R 4.0.3) | 
| dplyr | 1.0.2.9000 | 2020-12-14 | Github (tidyverse/dplyr@59105eb) | 
| ellipsis | 0.3.1 | 2020-05-15 | CRAN (R 4.0.3) | 
| evaluate | 0.14 | 2019-05-28 | CRAN (R 4.0.0) | 
| extrafont | 0.17 | 2014-12-08 | CRAN (R 4.0.2) | 
| extrafontdb | 1.0 | 2012-06-11 | CRAN (R 4.0.0) | 
| fansi | 0.4.1 | 2020-01-08 | CRAN (R 4.0.0) | 
| farver | 2.0.3 | 2020-01-16 | CRAN (R 4.0.0) | 
| forcats | 0.5.0.9000 | 2020-12-09 | Github (tidyverse/forcats@6c5e59f) | 
| fs | 1.5.0 | 2020-07-31 | CRAN (R 4.0.3) | 
| generics | 0.1.0 | 2020-10-31 | CRAN (R 4.0.3) | 
| GetoptLong | 1.0.5 | 2020-12-15 | CRAN (R 4.0.3) | 
| ggplot2 | 3.3.2.9000 | 2020-12-14 | Github (tidyverse/ggplot2@9deb97b) | 
| ggrepel | 0.9.0 | 2020-12-16 | CRAN (R 4.0.3) | 
| ggthemes | 4.2.0 | 2020-12-10 | Github (jrnold/ggthemes@fa3d1ac) | 
| GlobalOptions | 0.1.2 | 2020-06-10 | CRAN (R 4.0.0) | 
| glue | 1.4.2 | 2020-08-27 | CRAN (R 4.0.2) | 
| gt | 0.2.2 | 2020-11-25 | Github (rstudio/gt@bae32f4) | 
| gtable | 0.3.0 | 2019-03-25 | CRAN (R 4.0.0) | 
| gtools | 3.8.2 | 2020-03-31 | CRAN (R 4.0.0) | 
| haven | 2.3.1 | 2020-06-01 | CRAN (R 4.0.0) | 
| hms | 0.5.3 | 2020-01-08 | CRAN (R 4.0.0) | 
| htmltools | 0.5.0.9003 | 2020-12-03 | Github (rstudio/htmltools@d18bd8e) | 
| httr | 1.4.2 | 2020-07-20 | CRAN (R 4.0.2) | 
| IRanges | 2.24.1 | 2020-12-12 | Bioconductor | 
| jpeg | 0.1-8.1 | 2019-10-24 | CRAN (R 4.0.0) | 
| jsonlite | 1.7.2 | 2020-12-09 | CRAN (R 4.0.3) | 
| knitr | 1.30.4 | 2020-12-15 | Github (yihui/knitr@f8f90ba) | 
| labeling | 0.4.2 | 2020-10-20 | CRAN (R 4.0.3) | 
| lattice | 0.20-41 | 2020-04-02 | CRAN (R 4.0.3) | 
| lifecycle | 0.2.0 | 2020-03-06 | CRAN (R 4.0.0) | 
| lubridate | 1.7.9.2 | 2020-12-17 | Github (tidyverse/lubridate@8853a2a) | 
| magick | 2.5.2 | 2020-11-10 | CRAN (R 4.0.3) | 
| magrittr | 2.0.1.9000 | 2020-12-14 | Github (tidyverse/magrittr@bb1c86a) | 
| Matrix | 1.2-18 | 2019-11-27 | CRAN (R 4.0.2) | 
| MatrixModels | 0.4-1 | 2015-08-22 | CRAN (R 4.0.0) | 
| matrixStats | 0.57.0 | 2020-09-25 | CRAN (R 4.0.2) | 
| memoise | 1.1.0 | 2017-04-21 | CRAN (R 4.0.0) | 
| modelr | 0.1.8.9000 | 2020-11-23 | Github (tidyverse/modelr@16168e0) | 
| munsell | 0.5.0 | 2018-06-12 | CRAN (R 4.0.0) | 
| mvtnorm | 1.1-1 | 2020-06-09 | CRAN (R 4.0.2) | 
| patchwork | 1.1.1 | 2020-12-17 | CRAN (R 4.0.3) | 
| pbapply | 1.4-3 | 2020-08-18 | CRAN (R 4.0.2) | 
| pillar | 1.4.7 | 2020-11-20 | CRAN (R 4.0.3) | 
| pkgbuild | 1.2.0 | 2020-12-15 | CRAN (R 4.0.3) | 
| pkgconfig | 2.0.3 | 2019-09-22 | CRAN (R 4.0.0) | 
| pkgload | 1.1.0 | 2020-05-29 | CRAN (R 4.0.0) | 
| png | 0.1-7 | 2013-12-03 | CRAN (R 4.0.0) | 
| prettyunits | 1.1.1.9000 | 2020-11-23 | Github (r-lib/prettyunits@b1cdad8) | 
| processx | 3.4.5 | 2020-11-30 | CRAN (R 4.0.3) | 
| ps | 1.5.0 | 2020-12-05 | CRAN (R 4.0.3) | 
| purrr | 0.3.4.9000 | 2020-11-23 | Github (tidyverse/purrr@af06d45) | 
| R6 | 2.5.0 | 2020-11-02 | Github (r-lib/R6@6cf7d4e) | 
| ragg | 1.0.0.9000 | 2020-12-16 | Github (r-lib/ragg@cd1a50f) | 
| rappdirs | 0.3.1 | 2016-03-28 | CRAN (R 4.0.0) | 
| RColorBrewer | 1.1-2 | 2014-12-07 | CRAN (R 4.0.0) | 
| Rcpp | 1.0.5 | 2020-07-06 | CRAN (R 4.0.3) | 
| readr | 1.4.0.9000 | 2020-11-23 | Github (tidyverse/readr@97186a8) | 
| readxl | 1.3.1.9000 | 2020-11-23 | Github (tidyverse/readxl@9f85fa5) | 
| remotes | 2.2.0.9000 | 2020-12-03 | Github (r-lib/remotes@5d0d9fd) | 
| reprex | 0.3.0 | 2019-05-16 | CRAN (R 4.0.0) | 
| reticulate | 1.18 | 2020-10-25 | CRAN (R 4.0.3) | 
| rjson | 0.2.20 | 2018-06-08 | CRAN (R 4.0.0) | 
| rlang | 0.4.9.9000 | 2020-12-17 | Github (r-lib/rlang@b9b7ae2) | 
| rmarkdown | 2.6.0001 | 2020-12-17 | Github (rstudio/rmarkdown@7f3cd84) | 
| rprojroot | 2.0.2 | 2020-11-15 | CRAN (R 4.0.3) | 
| rstudioapi | 0.13 | 2020-11-12 | CRAN (R 4.0.3) | 
| Rttf2pt1 | 1.3.8 | 2020-01-10 | CRAN (R 4.0.0) | 
| rvest | 0.3.6 | 2020-07-25 | CRAN (R 4.0.2) | 
| S4Vectors | 0.28.1 | 2020-12-09 | Bioconductor | 
| sass | 0.2.0.9005 | 2020-12-01 | Github (rstudio/sass@1dda864) | 
| scales | 1.1.1 | 2020-05-11 | CRAN (R 4.0.3) | 
| sessioninfo | 1.1.1 | 2018-11-05 | CRAN (R 4.0.3) | 
| shape | 1.4.5 | 2020-09-13 | CRAN (R 4.0.2) | 
| stringi | 1.5.3 | 2020-09-09 | CRAN (R 4.0.2) | 
| stringr | 1.4.0.9000 | 2020-11-23 | Github (tidyverse/stringr@1f03eb0) | 
| styler | 1.3.2.9000 | 2020-11-30 | Github (r-lib/styler@d5b8b0e) | 
| systemfonts | 0.3.2.9000 | 2020-12-17 | Github (r-lib/systemfonts@d959a15) | 
| testthat | 3.0.1 | 2020-12-17 | Github (r-lib/testthat@e99155a) | 
| textshaping | 0.2.1.9000 | 2020-12-17 | Github (r-lib/textshaping@46c74ee) | 
| tibble | 3.0.4.9000 | 2020-12-13 | Github (tidyverse/tibble@5881b43) | 
| tidyr | 1.1.2.9000 | 2020-12-09 | Github (tidyverse/tidyr@581b488) | 
| tidyselect | 1.1.0 | 2020-05-11 | CRAN (R 4.0.3) | 
| tidyverse | 1.3.0.9000 | 2020-11-23 | Github (hadley/tidyverse@8a0bb99) | 
| usethis | 2.0.0.9000 | 2020-12-13 | Github (r-lib/usethis@45d0fef) | 
| vctrs | 0.3.6 | 2020-12-17 | CRAN (R 4.0.3) | 
| viridisLite | 0.3.0 | 2018-02-01 | CRAN (R 4.0.0) | 
| wesanderson | 0.3.6 | 2018-04-20 | CRAN (R 4.0.3) | 
| withr | 2.3.0 | 2020-09-22 | CRAN (R 4.0.2) | 
| xfun | 0.19 | 2020-10-30 | CRAN (R 4.0.3) | 
| xml2 | 1.3.2 | 2020-04-23 | CRAN (R 4.0.0) | 
| yaml | 2.2.1 | 2020-02-01 | CRAN (R 4.0.0) | 
| yarrr | 0.1.5 | 2017-04-19 | CRAN (R 4.0.3) |