[33bf40]: / TcellAnalysis / notebooks / COVID19_Tcell_UMAPs-Updated.Rmd

Download this file

537 lines (434 with data), 19.8 kB

---
title: "COVID19: T cell UMAPs - Updated"
output: html_notebook
---

Plotting of different UMAPs based on:

* T cell specific MNN-corrected PCs
* Gender-regressed T cell specific MNN-corrected PCs

```{r, warning=FALSE, message=FALSE}
library(ggplot2)
library(ggsci)
library(cowplot)
library(scattermore)
library(RColorBrewer)
library(reshape2)
library(colorspace)
library(dplyr)
library(ggthemes)
library(scales)
library(ggrepel)
library(viridis)
library(ggrastr)
```



```{r, warning=FALSE, message=FALSE}
all.meta <- read.table("~/Dropbox/COVID19/Data/Updated/COVID19_scMeta-data.tsv",
                       sep="\t", header=TRUE, stringsAsFactors=FALSE)
rownames(all.meta) <- all.meta$CellID

tcell.annotations <- read.table("~/Dropbox/COVID19/Data/Updated/Tcell_annotations_ext.tsv",
                                sep="\t", header=TRUE, stringsAsFactors=FALSE)
all.meta <- merge(all.meta, tcell.annotations, by='CellID')
all.meta$Status_on_day_collection_summary[all.meta$Status_on_day_collection_summary %in% c("LPS_90mins", "LPS_10hours")] <- "LPS"
```


```{r, warning=FALSE, message=FALSE}
# gender.umap <- read.table("~/Dropbox/COVID19/Data/Updated/Cambridge_Sanger_Newcastle_Tcell_UMAPs.tsv",
#                           sep="\t", header=TRUE, stringsAsFactors=FALSE)
```


```{r, warning=FALSE, message=FALSE}
# tcell.harmony.umap <- read.table("~/Dropbox/COVID19/Data/Updated/Cambridge_Sanger_Newcastle-Tcell_harmony_UMAPs.tsv",
#                            sep="\t", header=TRUE, stringsAsFactors=FALSE)
tcell.harmony.umap <- read.table("~/Dropbox/COVID19/Data/Updated/Cambridge_Sanger_Newcastle-Tcell_harmony-Gender_UMAPs.tsv",
                           sep="\t", header=TRUE, stringsAsFactors=FALSE)
colnames(tcell.harmony.umap) <- c("Harmony.UMAP1", "Harmony.UMAP2", "CellID")
```


```{r, warning=FALSE, message=FALSE}
# harmony.umap <- read.table("~/Dropbox/COVID19/Data/Updated/COVID_Harmony_UMAP_OnlyT_TonlyHVGs.csv",
#                            sep=",", header=FALSE, stringsAsFactors=FALSE)
# colnames(harmony.umap) <- c("CellID", "Harmony.UMAP1", "Harmony.UMAP2")
```


```{r}
cell.order <- c("CD4.Naive", "CD4.CM", "CD4.EM", "CD4.IL22", "CD4.Prolif", "CD4.Th1", "CD4.Th2", "CD4.Th17", "CD4.Tfh",
                "Treg", "CD8.Naive", "CD8.Activated", "CD8.Prolif", "CD8.CM", "CD8.TE", "CD8.EM", "gdT", "MAIT", "NKT")

all.qual.cols <- brewer.pal.info[brewer.pal.info$category %in% c("qual") & brewer.pal.info$colorblind, ]
col_vector = unlist(mapply(brewer.pal, all.qual.cols$maxcolors, rownames(all.qual.cols)))

# cell.cols <- col_vector[c(1:7, 9:19)]
cell.cols <- col_vector[c(1:17, 19, 20)]
names(cell.cols) <- cell.order
```



```{r}
tcell.umap <- read.table("~/Dropbox/COVID19/Data/Updated/Cambridge_Sanger_Newcastle_Tcell_UMAPs.tsv",
                         sep="\t", header=TRUE, stringsAsFactors=FALSE)
# tcell.umap <- merge(tcell.umap, gender.umap, by='CellID')
tcell.umap <- merge(tcell.umap, tcell.harmony.umap, by='CellID', all.y=TRUE)
tcell.umap.merge <- merge(all.meta, tcell.umap, by='CellID')


# cell.order <- c("CD4.Naive", "CD4.CM", "CD4.EM", "CD4.IL22", "CD4.Th1", "CD4.Th2", "CD4.Th17",
#                 "Treg", "CD4.Tfh", "CD8.Naive", "CD8.TE", "CD8.EM", "gdT", "MAIT", "NKT")
# 
# n.cells <- length(cell.order)
# cell.cols <- colorRampPalette(pal_futurama()(12))(n.cells)
# names(cell.cols) <- cell.order

tcell.umap.merge$Sub.Annotation <- factor(tcell.umap.merge$Sub.Annotation,
                                          levels=cell.order)

group.cols <- c("#2ca02c", "#1f77b4", "#9467bd", "#fed976", "#fd8d3c", "#e31a1c", "#800026", "#252525")
names(group.cols) <- c("Healthy", "LPS", "Non_covid", "Asymptomatic", "Mild", "Moderate", "Severe", "Critical")
```



```{r, fig.height=4.35, fig.width=10.95}
ggplot(tcell.umap.merge,
       aes(x=UMAP1, y=UMAP2)) +
    geom_scattermore(data=tcell.umap.merge[, c("UMAP1", "UMAP2")],
                     colour='grey80', alpha=0.5) +
    geom_scattermore(aes(colour=Site)) +
    scale_colour_tron() +
    facet_wrap(~Site) +
    theme_cowplot() +
    theme(strip.background=element_rect(colour='white', fill='white'),
          strip.text=element_text(size=14)) +
    guides(colour=guide_legend(title="Severity", override.aes = list(size=3))) +
    # ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_UMAP-site.pdf",
    #        height=4.35, width=10.95, useDingbats=FALSE) +
    NULL
```


```{r, fig.height=3.55, fig.width=5.15}
ggplot(tcell.umap.merge,
       aes(x=UMAP1, y=UMAP2, colour=Sub.Annotation)) +
    geom_scattermore() +
    scale_colour_manual(values=cell.cols) +
    theme_cowplot() +
    guides(colour=guide_legend(title="Cell type", override.aes = list(size=3))) +
    # ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_UMAP-annotation.pdf",
    #        height=3.55, width=5.15, useDingbats=FALSE) +
    NULL
```

And the UMAP with gender regressed out.

## Harmony UMAPs

```{r, fig.height=3.55, fig.width=5.15}
ggplot(tcell.umap.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2)) +
    geom_scattermore(aes(colour=Sub.Annotation)) +
    scale_colour_manual(values=cell.cols) +
    theme_cowplot() +
    labs(x="UMAP1", y="UMAP2") +
    guides(colour=guide_legend(title="Cell type", override.aes = list(size=3))) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP_annotation.pdf",
           height=3.55, width=5.95, useDingbats=FALSE) +
    NULL
```



```{r, fig.height=4.35, fig.width=10.95}
ggplot(tcell.umap.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2)) +
    geom_scattermore(data=tcell.umap.merge[, c("Harmony.UMAP1", "Harmony.UMAP2")],
                     colour='grey80', alpha=0.5) +
    geom_scattermore(aes(colour=Site)) +
    scale_colour_tron() +
    facet_wrap(~Site) +
    theme_cowplot() +
    theme(strip.background=element_rect(colour='white', fill='white'),
          strip.text=element_text(size=14)) +
    guides(colour=guide_legend(title="Severity", override.aes = list(size=3))) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP_GenderRegress-site.pdf",
           height=4.35, width=10.95, useDingbats=FALSE) +
    NULL
```



```{r, fig.height=10.95, fig.width=10.95}
ggplot(tcell.umap.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2)) +
     geom_scattermore(data=tcell.umap.merge[, c("Harmony.UMAP1", "Harmony.UMAP2")],
                     colour='grey80', alpha=0.5) +
    geom_scattermore(aes(colour=Sub.Annotation)) +
    scale_colour_manual(values=cell.cols) +
    theme_cowplot() +
    facet_wrap(~Sub.Annotation) +
    guides(colour=guide_legend(title="Cell type", override.aes = list(size=3))) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP-annotation.pdf",
           height=10.95, width=10.95, useDingbats=FALSE) +
    NULL
```

Calculate the average UMAP position for each cluster.

```{r, warning=FALSE, message=FALSE}
mean.umap.list <- list()

for(i in seq_along(cell.order)){
    i.c <- cell.order[i]
    i.dim1 <- mean(tcell.umap.merge$Harmony.UMAP1[tcell.umap.merge$Sub.Annotation %in% i.c])
    i.dim2 <- mean(tcell.umap.merge$Harmony.UMAP2[tcell.umap.merge$Sub.Annotation %in% i.c])
    mean.umap.list[[i.c]] <- data.frame("Sub.Annotation"=i.c, "Harmony.UMAP1"=i.dim1, "Harmony.UMAP2"=i.dim2)
}

mean.umap.text <- do.call(rbind.data.frame, mean.umap.list)
```


```{r, fig.height=3.55, fig.width=5.15}
ggplot(tcell.umap.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2)) +
    geom_scattermore(aes(colour=Sub.Annotation)) +
    geom_text(data=mean.umap.text, aes(label=Sub.Annotation)) +
    scale_colour_manual(values=cell.cols) +
    theme_cowplot() +
    labs(x="UMAP1", y="UMAP2") +
    guides(colour=guide_legend(title="Cell type", override.aes = list(size=3))) +
    # ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP_annotation.pdf",
    #        height=3.55, width=5.95, useDingbats=FALSE) +
    NULL
```

Only show the Th subsets.

```{r, fig.height=7.55, fig.width=9.15}
ggplot(tcell.umap.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2)) +
    geom_scattermore(data=tcell.umap.merge[, c("Harmony.UMAP1", "Harmony.UMAP2")],
                     colour='grey80', alpha=0.2) +
    geom_point_rast(data=tcell.umap.merge[tcell.umap.merge$Sub.Annotation %in% c("CD4.Th1", "CD4.Th2", "CD4.Th17", "CD4.Tfh"), ],
                    aes(colour=Sub.Annotation), size=0.1, raster.dpi=300) +
    scale_colour_manual(values=cell.cols) +
    facet_wrap(~Sub.Annotation) +
    theme_cowplot() +
    guides(colour=guide_legend(title="Cell type", override.aes = list(size=3))) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP-Th_annotation.pdf",
           height=7.55, width=9.15, useDingbats=FALSE) +
    NULL
```



## Different Harmony UMAPs

Calculate the average UMAP position for each cluster.

```{r, warning=FALSE, message=FALSE}
mean.umap.list <- list()

for(i in seq_along(cell.order)){
    i.c <- cell.order[i]
    i.dim1 <- mean(tcell.umap.merge$Harmony.UMAP1[tcell.umap.merge$Sub.Annotation %in% i.c])
    i.dim2 <- mean(tcell.umap.merge$Harmony.UMAP2[tcell.umap.merge$Sub.Annotation %in% i.c])
    mean.umap.list[[i.c]] <- data.frame("Sub.Annotation"=i.c, "Harmony.UMAP1"=i.dim1, "Harmony.UMAP2"=i.dim2)
}

mean.umap.text <- do.call(rbind.data.frame, mean.umap.list)
```


```{r, fig.height=3.55, fig.width=5.15}
ggplot(tcell.umap.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2)) +
    geom_scattermore(aes(colour=Sub.Annotation)) +
    geom_text(data=mean.umap.text, aes(label=Sub.Annotation)) +
    scale_colour_manual(values=cell.cols) +
    theme_cowplot() +
    labs(x="UMAP1", y="UMAP2") +
    guides(colour=guide_legend(title="Cell type", override.aes = list(size=3))) +
    # ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP_annotation.pdf",
    #        height=3.55, width=5.95, useDingbats=FALSE) +
    NULL
```

Only show the Th subsets.

```{r, fig.height=3.55, fig.width=5.15}
ggplot(tcell.umap.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2)) +
    geom_scattermore(data=tcell.umap.merge[, c("Harmony.UMAP1", "Harmony.UMAP2")],
                     colour='grey80', alpha=0.2) +
    geom_point_rast(data=tcell.umap.merge[tcell.umap.merge$Sub.Annotation %in% c("CD4.Th1", "CD4.Th2", "CD4.Th17", "CD4.Tfh"), ],
                    aes(colour=Sub.Annotation), size=0.1, raster.dpi=300) +
    scale_colour_manual(values=cell.cols) +
    theme_cowplot() +
    guides(colour=guide_legend(title="Cell type", override.aes = list(size=3))) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP-Th_annotation.pdf",
           height=3.55, width=5.15, useDingbats=FALSE) +
    NULL
```

Maybe show the density of a given label?

```{r}
get_density <- function(x, y, ...) {
  dens <- MASS::kde2d(x, y, ...)
  ix <- findInterval(x, dens$x)
  iy <- findInterval(y, dens$y)
  ii <- cbind(ix, iy)
  return(dens$z[ii])
}

dens.umap.list <- list()
loop.cells <- intersect(cell.order, unique(as.character(tcell.umap.merge$Sub.Annotation)))

for(i in seq_along(loop.cells)){
    i.c <- loop.cells[i]
    # change this to 1% of all cells
    i.n <- ceiling(sum(tcell.umap.merge$Sub.Annotation %in% i.c)/100)
    if(i.n < 100){
      i.n <- 100
    }
    i.dens <- get_density(tcell.umap.merge$Harmony.UMAP1[tcell.umap.merge$Sub.Annotation %in% i.c],
                          tcell.umap.merge$Harmony.UMAP2[tcell.umap.merge$Sub.Annotation %in% i.c], n=i.n)
    
    dens.umap.list[[i.c]] <- data.frame("Sub.Annotation"=i.c,
                                        "CellID"=tcell.umap.merge$CellID[tcell.umap.merge$Sub.Annotation %in% i.c],
                                        "Dens"=i.dens)
}

umap.dens <- do.call(rbind.data.frame, dens.umap.list)
umap.dens.merge <- merge(tcell.umap.merge, umap.dens, by=c('Sub.Annotation', 'CellID'))
```


```{r, fig.height=2.55, fig.width=3.15}
ggplot(umap.dens.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2)) +
    geom_scattermore(data=umap.dens.merge[, c("Harmony.UMAP1", "Harmony.UMAP2")],
                     colour='grey80', alpha=0.2) +
    geom_scattermore(data=umap.dens.merge[umap.dens.merge$Sub.Annotation %in% c("CD4.Tfh"), ],
                     aes(colour=Dens)) +
    scale_colour_viridis() +
    theme_cowplot() +
    theme(legend.key.size = unit(0.2, "cm"),
          legend.title=element_text(size=8),
          legend.text=element_text(size=6)) +
    guides(colour=guide_colourbar(title="CD4.Tfh density", override.aes = list(size=3))) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP-Tfh_density.pdf",
           height=2.55, width=2.95, useDingbats=FALSE) +
    NULL
```

```{r, fig.height=2.55, fig.width=3.15}
ggplot(umap.dens.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2)) +
    geom_scattermore(data=umap.dens.merge[, c("Harmony.UMAP1", "Harmony.UMAP2")],
                     colour='grey80', alpha=0.2) +
    geom_point_rast(data=umap.dens.merge[umap.dens.merge$Sub.Annotation %in% c("CD8.TE"), ],
                    aes(colour=Dens), size=0.1) +
    scale_colour_viridis() +
    theme_cowplot() +
    theme(legend.key.size = unit(0.2, "cm"),
          legend.title=element_text(size=8),
          legend.text=element_text(size=6)) +
    guides(colour=guide_colourbar(title="CD8.TE density", override.aes = list(size=3))) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP-CD8TE_density.pdf",
           height=2.55, width=2.95, useDingbats=FALSE) +
    NULL
```




```{r, fig.height=1.55, fig.width=1.95}
ggplot(umap.dens.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2)) +
  geom_scattermore(data=umap.dens.merge[, c("Harmony.UMAP1", "Harmony.UMAP2")],
                   colour='grey80', alpha=0.2) +
  geom_point_rast(data=umap.dens.merge[umap.dens.merge$Sub.Annotation %in% c("CD4.Th1"), ],
                  aes(colour=Dens), size=0.1) +
  scale_colour_viridis() +
  theme_cowplot() +
  labs(x="UMAP1", y="UMAP2") +
  theme(aspect=1,
        legend.key.size = unit(0.2, "cm"),
        axis.text=element_blank(),
        axis.title=element_blank(),
        legend.title=element_text(size=8),
        legend.text=element_blank()) +
  guides(colour=guide_colourbar(title="CD4.Th1\ndensity", override.aes = list(size=3))) +
  ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP-Th1_density.pdf",
         height=1.55, width=1.95, useDingbats=FALSE) +
    NULL
```



```{r, fig.height=1.55, fig.width=1.95}
ggplot(umap.dens.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2)) +
  geom_scattermore(data=umap.dens.merge[, c("Harmony.UMAP1", "Harmony.UMAP2")],
                   colour='grey80', alpha=0.2) +
  geom_point_rast(data=umap.dens.merge[umap.dens.merge$Sub.Annotation %in% c("CD4.Th2"), ],
                  aes(colour=Dens), size=0.1) +
  scale_colour_viridis() +
  theme_cowplot() +
  labs(x="UMAP1", y="UMAP2") +
  theme(aspect=1,
        legend.key.size = unit(0.2, "cm"),
        axis.text=element_blank(),
        axis.title=element_blank(),
        legend.title=element_text(size=8),
        legend.text=element_blank()) +
    guides(colour=guide_colourbar(title="CD4.Th2\ndensity", override.aes = list(size=3))) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP-Th2_density.pdf",
           height=1.55, width=1.95, useDingbats=FALSE) +
    NULL
```



```{r, fig.height=1.55, fig.width=1.95}
ggplot(umap.dens.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2)) +
  geom_scattermore(data=umap.dens.merge[, c("Harmony.UMAP1", "Harmony.UMAP2")],
                   colour='grey80', alpha=0.2) +
  geom_point_rast(data=umap.dens.merge[umap.dens.merge$Sub.Annotation %in% c("CD4.Th17"), ],
                  aes(colour=Dens), size=0.1) +
  scale_colour_viridis() +
  theme_cowplot() +
  labs(x="UMAP1", y="UMAP2") +
  theme(aspect=1,
        legend.key.size = unit(0.2, "cm"),
        axis.text=element_blank(),
        axis.title=element_blank(),
        legend.title=element_text(size=8),
        legend.text=element_blank()) +
  guides(colour=guide_colourbar(title="CD4.Th17\ndensity", override.aes = list(size=3))) +
  ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP-Th17_density.pdf",
           height=1.55, width=1.95, useDingbats=FALSE) +
    NULL
```



```{r, fig.height=1.55, fig.width=2.95}
ggplot(umap.dens.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2)) +
    geom_scattermore(data=umap.dens.merge[, c("Harmony.UMAP1", "Harmony.UMAP2")],
                     colour='grey80', alpha=0.2) +
    geom_point_rast(data=umap.dens.merge[umap.dens.merge$Sub.Annotation %in% c("CD4.Th1", "CD4.Th2", "CD4.Th17"), ],
                     aes(colour=Dens), size=0.1) +
    scale_colour_viridis() +
    theme_cowplot() +
     labs(x="UMAP1", y="UMAP2") +
  theme(legend.key.size = unit(0.2, "cm"),
        axis.text=element_blank(),
        legend.title=element_text(size=8),
        legend.text=element_blank()) +
    guides(colour=guide_colourbar(title="CD4.Th density", override.aes = list(size=3))) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP-Thall_density.pdf",
           height=1.55, width=2.95, useDingbats=FALSE) +
    NULL
```




```{r, fig.height=10.95, fig.width=12.95}
# generate a series of PDFs, one for each cell type
for(x in seq_along(cell.order)){
  x.c <- cell.order[x]
  
  ggplot(umap.dens.merge,
         aes(x=Harmony.UMAP1, y=Harmony.UMAP2)) +
    geom_scattermore(data=umap.dens.merge[, c("Harmony.UMAP1", "Harmony.UMAP2")],
                     colour='grey80', alpha=0.2) +
    geom_point_rast(data=umap.dens.merge[umap.dens.merge$Sub.Annotation %in% x.c, ],
                    aes(colour=Dens), size=0.01) +
    scale_colour_viridis() +
    labs(x="UMAP1", y="UMAP2") +
    theme_cowplot() +
    guides(colour=guide_colourbar(title="Density")) +
    theme(legend.key.size = unit(0.2, "cm"),
          axis.text=element_blank(),
          legend.title=element_text(size=8),
          legend.text=element_blank()) +
    ggsave(paste0("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP-", x.c, "_density_annotation.pdf"),
           height=1.55, width=2.55, useDingbats=FALSE) +
  NULL
}

```



```{r, fig.height=3.55, fig.width=5.15}
ggplot(tcell.umap.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2, colour=Sex)) +
    geom_scattermore() +
     scale_colour_colorblind() +
    theme_cowplot() +
    guides(colour=guide_legend(title="Cell type", override.aes = list(size=3))) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP-gender.pdf",
           height=3.55, width=5.15, useDingbats=FALSE) +
    NULL
```


```{r, fig.height=3.55, fig.width=5.15}
ggplot(tcell.umap.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2, colour=Status_on_day_collection_summary)) +
    geom_scattermore() +
    scale_colour_manual(values=group.cols) +
    theme_cowplot() +
    guides(colour=guide_legend(title="Cell type", override.aes = list(size=3))) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP-severity.pdf",
           height=3.55, width=5.15, useDingbats=FALSE) +
    NULL
```


```{r, fig.height=3.55, fig.width=5.15}
ggplot(tcell.umap.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2, colour=Smoker)) +
    geom_scattermore() +
    scale_colour_aaas() +
    theme_cowplot() +
    guides(colour=guide_legend(title="Cell type", override.aes = list(size=3))) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP-ethnicity.pdf",
           height=3.55, width=5.15, useDingbats=FALSE) +
    NULL
```



```{r, fig.height=3.55, fig.width=5.15}
ggplot(tcell.umap.merge,
       aes(x=Harmony.UMAP1, y=Harmony.UMAP2, colour=Age)) +
    geom_scattermore() +
    scale_colour_gradient(low="blue", high="orange") +
    theme_cowplot() +
    guides(colour=guide_colourbar(title="Age")) +
    ggsave("~/Dropbox/COVID19/Updated_plots/Tcell_Harmony-UMAP-age.pdf",
           height=3.55, width=5.15, useDingbats=FALSE) +
    NULL
```