|
1 | | -#' Add milestone coloring |
2 | | -#' @param color_milestones How to color the cells |
3 | | -#' @param milestones Tibble containing the `milestone_id` and a `color` for each milestone |
4 | | -#' |
5 | | -#' @include milestone_palette.R |
6 | | -add_milestone_coloring <- function( |
7 | | - milestones = NULL, |
8 | | - color_milestones = c("auto", "given", get_milestone_palette_names()) |
9 | | -) { |
10 | | - color_milestones <- match.arg(color_milestones) |
11 | | - |
12 | | - if (color_milestones == "given") { |
13 | | - if (!"color" %in% names(milestones)) { |
14 | | - stop("Milestone colors need to be given") |
15 | | - } |
16 | | - } else if (color_milestones %in% get_milestone_palette_names()) { |
17 | | - if (!(color_milestones == "auto" && "color" %in% names(milestones))) { |
18 | | - milestones <- milestones %>% |
19 | | - mutate(color = milestone_palette(color_milestones, n = n())) |
20 | | - } |
21 | | - } |
22 | | - |
23 | | - milestones |
24 | | -} |
25 | | -formals(add_milestone_coloring)$color_milestones <- unique(c("auto", "given", get_milestone_palette_names())) |
26 | | - |
27 | | - |
28 | | -#' @importFrom grDevices rgb |
29 | | -mix_colors <- function(milid, milpct, milestone_colors) { |
30 | | - color_rgb <- apply(milestone_colors[milid,,drop = FALSE], 2, function(x) sum(x * milpct)) |
31 | | - color_rgb[color_rgb < 0] <- 0 |
32 | | - color_rgb[color_rgb > 256] <- 256 |
33 | | - do.call(grDevices::rgb, as.list(c(color_rgb, maxColorValue = 256))) |
34 | | -} |
35 | | - |
36 | | -#' Add coloring |
37 | | -#' @param cell_positions The positions of the cells |
38 | | -#' @param color_cells How to color the cells |
39 | | -#' @param trajectory The trajectory |
40 | | -#' @param grouping The grouping of the cells |
41 | | -#' @param groups Tibble containing information of the cell groups |
42 | | -#' @param feature_oi feature to plot expression |
43 | | -#' @param expression_source Source of the feature expression, defaults to `expression` |
44 | | -#' @param pseudotime The pseudotime |
45 | | -#' @param milestone_percentages The milestone percentages |
46 | | -#' |
47 | | -#' @inheritParams add_milestone_coloring |
48 | | -add_cell_coloring <- dynutils::inherit_default_params( |
49 | | - add_milestone_coloring, |
50 | | - function( |
51 | | - cell_positions, |
52 | | - color_cells = c("auto", "none", "grouping", "feature", "milestone", "pseudotime"), |
53 | | - trajectory, |
54 | | - grouping = NULL, |
55 | | - groups = NULL, |
56 | | - feature_oi = NULL, |
57 | | - expression_source = "expression", |
58 | | - pseudotime = NULL, |
59 | | - color_milestones = NULL, |
60 | | - milestones = NULL, |
61 | | - milestone_percentages = NULL |
62 | | - ) { |
63 | | - # check cell coloration |
64 | | - color_cells <- match.arg(color_cells) |
65 | | - if (color_cells == "auto") { |
66 | | - if (!is.null(grouping)) { |
67 | | - message("Coloring by grouping") |
68 | | - color_cells <- "grouping" |
69 | | - } else if (!is.null(feature_oi)) { |
70 | | - message("Coloring by expression") |
71 | | - color_cells <- "feature" |
72 | | - } else if (!is.null(milestones) | !is.null(milestone_percentages)) { |
73 | | - message("Coloring by milestone") |
74 | | - color_cells <- "milestone" |
75 | | - } else if (!is.null(pseudotime)) { |
76 | | - message("Coloring by pseudotime") |
77 | | - color_cells <- "pseudotime" |
78 | | - } else { |
79 | | - color_cells <- "grey" |
80 | | - } |
81 | | - } |
82 | | - if (color_cells == "grouping") { |
83 | | - grouping <- get_grouping(trajectory, grouping) |
84 | | - } else if (color_cells == "feature") { |
85 | | - expression <- get_expression(trajectory, expression_source) |
86 | | - check_feature(expression, feature_oi) |
87 | | - } else if (color_cells == "milestone") { |
88 | | - if (is.null(milestone_percentages)) { |
89 | | - message("Using milestone_percentages from trajectory") |
90 | | - milestone_percentages <- trajectory$milestone_percentages |
91 | | - } |
92 | | - # TODO more checks |
93 | | - } else if (color_cells == "pseudotime") { |
94 | | - pseudotime <- check_pseudotime(trajectory, pseudotime) |
95 | | - cell_positions$pseudotime <- pseudotime[cell_positions$cell_id] |
96 | | - } |
97 | | - |
98 | | - # now create the actual coloring |
99 | | - if (color_cells == "grouping") { |
100 | | - groups <- check_groups(grouping, groups) |
101 | | - |
102 | | - cell_positions$color <- grouping[match(cell_positions$cell_id, names(grouping))] |
103 | | - |
104 | | - color_scale <- scale_color_manual(color_cells, values = set_names(groups$color, groups$group_id), guide = guide_legend(ncol = 5)) |
105 | | - fill_scale <- scale_fill_manual(color_cells, values = set_names(groups$color, groups$group_id), guide = guide_legend(ncol = 5)) |
106 | | - |
107 | | - } else if (color_cells == "feature") { |
108 | | - cell_positions$color <- expression[cell_positions$cell_id, feature_oi] |
109 | | - color_scale <- scale_color_distiller(paste0(feature_oi, " expression"), palette = "RdYlBu") |
110 | | - fill_scale <- scale_fill_distiller(paste0(feature_oi, " expression"), palette = "RdYlBu") |
111 | | - } else if (is_colour_vector(color_cells)) { |
112 | | - cell_positions$color <- "trajectories_are_awesome" |
113 | | - color_scale <- scale_color_manual(NULL, values = c("trajectories_are_awesome" = color_cells), guide = "none") |
114 | | - fill_scale <- scale_fill_manual(NULL, values = c("trajectories_are_awesome" = color_cells), guide = "none") |
115 | | - } else if (color_cells == "milestone") { |
116 | | - if (is.null(milestones)) { |
117 | | - assert_that( |
118 | | - milestone_percentages$milestone_id %in% trajectory$milestone_ids, |
119 | | - msg = "Not all milestones were found in milestones tibble. Supply milestones tibble if supplying milestone_percentages separately." |
120 | | - ) |
121 | | - milestones <- tibble(milestone_id = trajectory$milestone_ids) |
122 | | - } |
123 | | - if (!"color" %in% names(milestones)) { |
124 | | - milestones <- milestones %>% add_milestone_coloring(color_milestones) |
125 | | - } |
126 | | - |
127 | | - milestone_colors <- set_names(milestones$color, milestones$milestone_id) %>% col2rgb %>% t |
128 | | - |
129 | | - cell_colors <- |
130 | | - milestone_percentages %>% |
131 | | - group_by(.data$cell_id) %>% |
132 | | - summarise(color = mix_colors(.data$milestone_id, .data$percentage, milestone_colors)) |
133 | | - |
134 | | - cell_positions <- left_join(cell_positions, cell_colors, "cell_id") |
135 | | - |
136 | | - color_scale <- scale_color_identity(NULL, guide = "none") |
137 | | - fill_scale <- scale_fill_identity(NULL, guide = "none") |
138 | | - } else if (color_cells == "pseudotime") { |
139 | | - cell_positions$color <- cell_positions$pseudotime |
140 | | - # color_scale <- viridis::scale_color_viridis("pseudotime") |
141 | | - # fill_scale <- viridis::scale_fill_viridis("pseudotime") |
142 | | - color_scale <- ggplot2::scale_color_viridis_c("pseudotime") |
143 | | - fill_scale <- ggplot2::scale_fill_viridis_c("pseudotime") |
144 | | - } else if (color_cells == "none") { |
145 | | - cell_positions$color <- "black" |
146 | | - color_scale <- scale_color_identity() |
147 | | - fill_scale <- scale_fill_identity() |
148 | | - } |
149 | | - |
150 | | - lst(cell_positions, color_scale, fill_scale, color_cells) |
151 | | - } |
152 | | -) |
153 | | - |
154 | 1 | #' Color cells using a background density |
155 | 2 | #' |
156 | 3 | #' @param cell_positions The positions of the cells in 2D |
@@ -244,9 +91,9 @@ add_density_coloring <- function( |
244 | 91 |
|
245 | 92 | # find closest empty position to put label |
246 | 93 | group_label_positions <- crossing( |
247 | | - centers %>% rename_if(is.numeric, ~paste0(., "_center")), |
248 | | - blank_space |
249 | | - ) %>% |
| 94 | + centers %>% rename_if(is.numeric, ~paste0(., "_center")), |
| 95 | + blank_space |
| 96 | + ) %>% |
250 | 97 | mutate( |
251 | 98 | distance = sqrt((.data$comp_1_center - .data$comp_1)**2 + abs(.data$comp_2_center - .data$comp_2)**2) |
252 | 99 | ) %>% |
@@ -314,7 +161,6 @@ add_density_coloring <- function( |
314 | 161 | density_plots |
315 | 162 | } |
316 | 163 |
|
317 | | - |
318 | 164 | smooth_2d <- function(x, y, h, e, n, lims) { |
319 | 165 | # create points |
320 | 166 | gx <- seq(lims[1], lims[2], length = n) |
|
0 commit comments