Diff of /src/cluster_dotplot.R [000000] .. [fb5156]

Switch to side-by-side view

--- a
+++ b/src/cluster_dotplot.R
@@ -0,0 +1,56 @@
+library(Seurat)
+library(aplot)
+library(Polychrome)
+
+cluster_dot_plot<- function(obj, features, annotation, color_scale_limits = c(-1.5, 2.5), 
+                            annotation_colors = NULL){
+  p<- DotPlot(object = obj, features = features)
+  df<- p$data
+  df<- left_join(df, annotation, by =c("id" = "seurat_clusters")) %>%
+    mutate(id = paste0(annotation, "_", id))
+  
+  dot_plot <- df %>% 
+    filter(!is.nan(avg.exp.scaled)) %>%
+    ggplot(aes(x=id, y = features.plot, color = avg.exp.scaled, size = pct.exp)) + 
+    geom_point() + 
+    cowplot::theme_cowplot() + 
+    theme(axis.line  = element_blank()) +
+    theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
+    ylab(NULL) +
+    xlab(NULL) +
+    theme(axis.ticks = element_blank()) +
+    scale_color_gradientn(colours = viridis::viridis(20), limits = color_scale_limits , oob = scales::squish, name = 'scaled expression') +
+    scale_y_discrete(position = "right")
+  
+  mat <- df %>% 
+    select(-pct.exp, -avg.exp, -annotation) %>%  # drop unused columns to facilitate widening
+    filter(!is.nan(avg.exp.scaled)) %>%
+    pivot_wider(names_from = id, values_from = avg.exp.scaled) %>% 
+    data.frame() # make df as tibbles -> matrix annoying
+  row.names(mat) <- mat$features.plot  # put gene in `row`
+  mat <- mat[,-1] #drop gene column as now in rows
+  mat<- mat[complete.cases(mat), ] # remove some rows with NaNs
+  clust <- hclust(dist(mat %>% as.matrix())) # hclust with distance matrix
+  
+  ggtree_plot <- ggtree::ggtree(clust)
+  
+  v_clust <- hclust(dist(mat %>% as.matrix() %>% t()))
+  library(ggtree)
+  ggtree_plot_col <- ggtree(v_clust) + layout_dendrogram()
+  
+  if (is.null(annotation_colors)) {
+    labels<- ggplot(df, aes(id, y=1, fill= annotation)) + geom_tile() +
+      scale_fill_brewer(palette = 'Paired',name="Cell Type") + 
+      theme_void()
+  } else {
+    labels<- ggplot(df, aes(id, y=1, fill= annotation)) + geom_tile() +
+      scale_fill_manual(values = annotation_colors ,name="Cell Type") + 
+      theme_void()
+  }
+  
+  dot_plot %>% 
+    insert_left(ggtree_plot, width=.2) %>%
+    insert_top(labels, height=.02) %>%
+    insert_top(ggtree_plot_col, height=.1)
+  
+}
\ No newline at end of file