... | ... |
@@ -191,7 +191,7 @@ collapse.ggtree <- function(x=NULL, node, mode = "none", clade_name = NULL, ...) |
191 | 191 |
##' @inheritParams get_taxa_name |
192 | 192 |
##' @return tree view |
193 | 193 |
##' @export |
194 |
-##' examples |
|
194 |
+##' @examples |
|
195 | 195 |
##' x <- rtree(15) |
196 | 196 |
##' p <- ggtree(x) + geom_tiplab() |
197 | 197 |
##' p1 <- collapse(p, 17) |
... | ... |
@@ -300,10 +300,12 @@ rotate <- function(tree_view=NULL, node) { |
300 | 300 |
##' @param node2 node number of clade 2. It should share a same parent node with node1 |
301 | 301 |
##' @return ggplot object |
302 | 302 |
##' @export |
303 |
+##' @examples |
|
304 |
+##' set.seed(123) |
|
303 | 305 |
##' x <- rtree(15) |
304 | 306 |
##' p <- ggtree(x) + geom_tiplab() + |
305 | 307 |
##' geom_nodelab(aes(subset=!isTip, label=node), hjust = -.1, color = "red") |
306 |
-##' flip(p, 19, 20) ## Depends on the condition of your tree |
|
308 |
+##' flip(p, 23, 24) ## Depends on the condition of your tree |
|
307 | 309 |
##' @author Guangchuang Yu |
308 | 310 |
flip <- function(tree_view=NULL, node1, node2) { |
309 | 311 |
tree_view %<>% get_tree_view |
... | ... |
@@ -4,7 +4,7 @@ |
4 | 4 |
##' This function extract an ordered vector of the tips from selected clade or the whole tree |
5 | 5 |
##' based on the ggtree() plot. |
6 | 6 |
##' @title get_taxa_name |
7 |
-##' @param tree_view tree view (i.e. the ggtree object). If tree_view is NULL, the last ggplot will be used. |
|
7 |
+##' @param tree_view tree view (i.e. the ggtree object). If tree_view is NULL, the last ggplot object will be used. |
|
8 | 8 |
##' @param node internal node number to specify a clade. If NULL, using the whole tree |
9 | 9 |
##' @return ordered taxa name vector |
10 | 10 |
##' @importFrom tidytree offspring |
... | ... |
@@ -35,17 +35,22 @@ get_taxa_name <- function(tree_view=NULL, node=NULL) { |
35 | 35 |
} |
36 | 36 |
|
37 | 37 |
|
38 |
-##' view a clade of tree |
|
38 |
+##' view a selected clade of tree, clade can be selected by specifying a node number or |
|
39 |
+##' determined by the most recent common ancestor of selected tips |
|
39 | 40 |
##' |
40 | 41 |
##' |
41 | 42 |
##' @title viewClade |
42 | 43 |
##' @inheritParams get_taxa_name |
43 |
-##' @param xmax_adjust adjust xmax |
|
44 |
+##' @param xmax_adjust adjust the max range of x axis |
|
44 | 45 |
##' @return clade plot |
45 | 46 |
##' @importFrom ggplot2 ggplot_build |
46 | 47 |
##' @importFrom ggplot2 coord_cartesian |
47 | 48 |
##' @importFrom aplot xrange |
48 | 49 |
##' @export |
50 |
+##' @examples |
|
51 |
+##' x <- rtree(15) |
|
52 |
+##' p <- ggtree(x) + geom_tiplab() |
|
53 |
+##' viewClade(p, 18, xmax_adjust = 0.) |
|
49 | 54 |
##' @author Guangchuang Yu |
50 | 55 |
viewClade <- function(tree_view=NULL, node, xmax_adjust=0) { |
51 | 56 |
tree_view %<>% get_tree_view |
... | ... |
@@ -70,20 +75,26 @@ is.viewClade <- function(tree_view) { |
70 | 75 |
|
71 | 76 |
|
72 | 77 |
|
73 |
-##' collapse a clade |
|
78 |
+##' collapse a selected clade, which can later be expanded with the 'expand()' fuction if necessary |
|
74 | 79 |
##' |
75 | 80 |
##' |
76 | 81 |
##' @title collapse-ggtree |
77 | 82 |
##' @rdname collapse |
78 | 83 |
##' @param x tree view (i.e. the ggtree object). If tree_view is NULL, the last ggplot will be used. |
79 | 84 |
##' @param node internal node number |
80 |
-##' @param mode one of 'none', 'max', 'min' and 'mixed' |
|
81 |
-##' @param clade_name set clade name. If clade_name = NULL, do nothing |
|
82 |
-##' @param ... additional parameters |
|
85 |
+##' @param mode one of 'none'(default), 'max', 'min' and 'mixed'. 'none' would simply collapse the clade as 'tip' and |
|
86 |
+##' the rest will display a triangle, whose shape is determined by the farest/closest tip of the collapsed clade to indicate it |
|
87 |
+##' @param clade_name set a name for the collapsed clade. If clade_name = NULL, do nothing |
|
88 |
+##' @param ... additional parameters to set the color or transparency of the triangle |
|
83 | 89 |
##' @return tree view |
84 | 90 |
##' @method collapse ggtree |
85 | 91 |
##' @importFrom ggplot2 geom_polygon |
86 | 92 |
##' @export |
93 |
+##' @examples |
|
94 |
+##' x <- rtree(15) |
|
95 |
+##' p <- ggtree(x) + geom_tiplab() |
|
96 |
+##' p |
|
97 |
+##' p1 <- collapse(p, node = 17, mode = "mixed", clade_name = "cclade", alpha = 0.8, color = "grey", fill = "light blue") |
|
87 | 98 |
##' @seealso expand |
88 | 99 |
##' @author Guangchuang Yu |
89 | 100 |
collapse.ggtree <- function(x=NULL, node, mode = "none", clade_name = NULL, ...) { |
... | ... |
@@ -173,13 +184,18 @@ collapse.ggtree <- function(x=NULL, node, mode = "none", clade_name = NULL, ...) |
173 | 184 |
tree_view |
174 | 185 |
} |
175 | 186 |
|
176 |
-##' expand collased clade |
|
187 |
+##' expand collapsed clade |
|
177 | 188 |
##' |
178 | 189 |
##' |
179 | 190 |
##' @title expand |
180 | 191 |
##' @inheritParams get_taxa_name |
181 | 192 |
##' @return tree view |
182 | 193 |
##' @export |
194 |
+##' examples |
|
195 |
+##' x <- rtree(15) |
|
196 |
+##' p <- ggtree(x) + geom_tiplab() |
|
197 |
+##' p1 <- collapse(p, 17) |
|
198 |
+##' expand(p1, 17) |
|
183 | 199 |
##' @seealso collapse |
184 | 200 |
##' @author Guangchuang Yu |
185 | 201 |
expand <- function(tree_view=NULL, node) { |
... | ... |
@@ -230,13 +246,17 @@ expand <- function(tree_view=NULL, node) { |
230 | 246 |
return(tree_view) |
231 | 247 |
} |
232 | 248 |
|
233 |
-##' rotate 180 degree of a selected branch |
|
249 |
+##' rotate selected clade by 180 degree |
|
234 | 250 |
##' |
235 | 251 |
##' |
236 | 252 |
##' @title rotate |
237 | 253 |
##' @inheritParams get_taxa_name |
238 | 254 |
##' @return ggplot2 object |
239 | 255 |
##' @export |
256 |
+##' @examples |
|
257 |
+##' x <- rtree(15) |
|
258 |
+##' p <- ggtree(x) + geom_tiplab() |
|
259 |
+##' rotate(p, 17) |
|
240 | 260 |
##' @author Guangchuang Yu |
241 | 261 |
rotate <- function(tree_view=NULL, node) { |
242 | 262 |
tree_view %<>% get_tree_view |
... | ... |
@@ -271,15 +291,19 @@ rotate <- function(tree_view=NULL, node) { |
271 | 291 |
|
272 | 292 |
|
273 | 293 |
|
274 |
-##' flip position of two selected branches |
|
294 |
+##' exchange the position of 2 clades |
|
275 | 295 |
##' |
276 | 296 |
##' |
277 | 297 |
##' @title flip |
278 | 298 |
##' @param tree_view tree view (i.e. the ggtree object). If tree_view is NULL, the last ggplot will be used. |
279 |
-##' @param node1 node number of branch 1 |
|
280 |
-##' @param node2 node number of branch 2 |
|
281 |
-##' @return ggplot2 object |
|
299 |
+##' @param node1 node number of clade 1. It should share a same parent node with node2 |
|
300 |
+##' @param node2 node number of clade 2. It should share a same parent node with node1 |
|
301 |
+##' @return ggplot object |
|
282 | 302 |
##' @export |
303 |
+##' x <- rtree(15) |
|
304 |
+##' p <- ggtree(x) + geom_tiplab() + |
|
305 |
+##' geom_nodelab(aes(subset=!isTip, label=node), hjust = -.1, color = "red") |
|
306 |
+##' flip(p, 19, 20) ## Depends on the condition of your tree |
|
283 | 307 |
##' @author Guangchuang Yu |
284 | 308 |
flip <- function(tree_view=NULL, node1, node2) { |
285 | 309 |
tree_view %<>% get_tree_view |
... | ... |
@@ -342,17 +366,22 @@ flip <- function(tree_view=NULL, node1, node2) { |
342 | 366 |
} |
343 | 367 |
|
344 | 368 |
|
345 |
-##' scale clade |
|
369 |
+##' zoom out/in a selected clade to emphasize or de-emphasize it |
|
346 | 370 |
##' |
347 | 371 |
##' |
348 | 372 |
##' @title scaleClade |
349 | 373 |
##' @inheritParams get_taxa_name |
350 |
-##' @param scale scale |
|
351 |
-##' @param vertical_only logical. If TRUE, only vertical will be scaled. |
|
374 |
+##' @param scale the scale of the selected clade. The clade will be zoom in when scale > 1, |
|
375 |
+##' and will be zoom out when scale < 1 |
|
376 |
+##' @param vertical_only logical. If TRUE (default), only vertical will be scaled. |
|
352 | 377 |
##' If FALSE, the clade will be scaled vertical and horizontally. |
353 |
-##' TRUE by default. |
|
354 | 378 |
##' @return tree view |
355 | 379 |
##' @export |
380 |
+##' @examples |
|
381 |
+##' x <- rtree(15) |
|
382 |
+##' p <- ggtree(x) + geom_tiplab() + |
|
383 |
+##' geom_nodelab(aes(subset=!isTip, label=node), hjust = -.1, color = "red") |
|
384 |
+##' scaleClade(p, 24, scale = .1) |
|
356 | 385 |
##' @author Guangchuang Yu |
357 | 386 |
scaleClade <- function(tree_view=NULL, node, scale=1, vertical_only=TRUE) { |
358 | 387 |
tree_view %<>% get_tree_view |
... | ... |
@@ -431,15 +460,20 @@ reassign_y_from_node_to_root <- function(df, node) { |
431 | 460 |
} |
432 | 461 |
|
433 | 462 |
|
434 |
-##' zoom selected clade of a tree |
|
463 |
+##' zoom in on a selected clade of a tree, while showing its on the full view of tree as a seperated panel for reference |
|
435 | 464 |
##' |
436 | 465 |
##' |
437 | 466 |
##' @title zoomClade |
438 | 467 |
##' @inheritParams get_taxa_name |
439 |
-##' @param xexpand numeric, extend x, meaning the ratio of range of original x, |
|
468 |
+##' @param xexpand numeric, expend the xlim of the zoom area. |
|
440 | 469 |
##' default is NULL. |
441 | 470 |
##' @return full tree with zoom in clade |
442 | 471 |
##' @author Guangchuang Yu |
472 |
+##' @examples |
|
473 |
+##' x <- rtree(15) |
|
474 |
+##' p <- ggtree(x) + geom_tiplab() + |
|
475 |
+##' geom_nodelab(aes(subset=!isTip, label=node), hjust = -.1, color = "red") |
|
476 |
+##' zoomClade(p, 21, xexpand = .2) |
|
443 | 477 |
##' @export |
444 | 478 |
zoomClade <- function(tree_view = NULL, node, xexpand=NULL) { |
445 | 479 |
p <- get_tree_view(tree_view) |
... | ... |
@@ -120,7 +120,7 @@ collapse.ggtree <- function(x=NULL, node, mode = "none", clade_name = NULL, ...) |
120 | 120 |
df <- reassign_y_from_node_to_root(df, node) |
121 | 121 |
|
122 | 122 |
## re-calculate branch mid position |
123 |
- df <- calculate_branch_mid(df) |
|
123 |
+ df <- calculate_branch_mid(df, layout=get_layout(tree_view)) |
|
124 | 124 |
|
125 | 125 |
ii <- which(!is.na(df$x)) |
126 | 126 |
df$angle[ii] <- calculate_angle(df[ii,])$angle |
... | ... |
@@ -217,7 +217,7 @@ expand <- function(tree_view=NULL, node) { |
217 | 217 |
df[pp, "y"] <- mean(df$y[j]) |
218 | 218 |
|
219 | 219 |
## re-calculate branch mid position |
220 |
- df <- calculate_branch_mid(df) |
|
220 |
+ df <- calculate_branch_mid(df, layout=get_layout(tree_view)) |
|
221 | 221 |
|
222 | 222 |
tree_view$data <- calculate_angle(df) |
223 | 223 |
} else { |
... | ... |
@@ -400,7 +400,7 @@ scaleClade <- function(tree_view=NULL, node, scale=1, vertical_only=TRUE) { |
400 | 400 |
df <- reassign_y_from_node_to_root(df, node) |
401 | 401 |
|
402 | 402 |
## re-calculate branch mid position |
403 |
- df <- calculate_branch_mid(df) |
|
403 |
+ df <- calculate_branch_mid(df, layout=get_layout(tree_view)) |
|
404 | 404 |
|
405 | 405 |
tree_view$data <- calculate_angle(df) |
406 | 406 |
|
... | ... |
@@ -1,12 +1,18 @@ |
1 | 1 |
##' get taxa name of a selected node (or tree if node=NULL) sorted by their position in plotting |
2 | 2 |
##' |
3 | 3 |
##' |
4 |
+##' This function extract an ordered vector of the tips from selected clade or the whole tree |
|
5 |
+##' based on the ggtree() plot. |
|
4 | 6 |
##' @title get_taxa_name |
5 | 7 |
##' @param tree_view tree view (i.e. the ggtree object). If tree_view is NULL, the last ggplot will be used. |
6 |
-##' @param node internal node number |
|
7 |
-##' @return taxa name vector |
|
8 |
+##' @param node internal node number to specify a clade. If NULL, using the whole tree |
|
9 |
+##' @return ordered taxa name vector |
|
8 | 10 |
##' @importFrom tidytree offspring |
9 | 11 |
##' @export |
12 |
+##' @examples |
|
13 |
+##' tree <- rtree(30) |
|
14 |
+##' p <- ggtree(tree) |
|
15 |
+##' get_taxa_name(p) |
|
10 | 16 |
##' @author Guangchuang Yu |
11 | 17 |
get_taxa_name <- function(tree_view=NULL, node=NULL) { |
12 | 18 |
tree_view %<>% get_tree_view |
... | ... |
@@ -18,6 +24,10 @@ get_taxa_name <- function(tree_view=NULL, node=NULL) { |
18 | 24 |
df <- offspring(df, node) |
19 | 25 |
} |
20 | 26 |
|
27 |
+ ## dplyr::filter(.data$isTip) %>% |
|
28 |
+ ## dplyr::arrange(dplyr::desc(.data$y)) %>% |
|
29 |
+ ## dplyr::pull(.data$label) |
|
30 |
+ |
|
21 | 31 |
with(df, { |
22 | 32 |
i = order(y, decreasing=T) |
23 | 33 |
label[i][isTip[i]] |
... | ... |
@@ -426,14 +426,20 @@ reassign_y_from_node_to_root <- function(df, node) { |
426 | 426 |
##' |
427 | 427 |
##' @title zoomClade |
428 | 428 |
##' @inheritParams get_taxa_name |
429 |
+##' @param xexpand numeric, extend x, meaning the ratio of range of original x, |
|
430 |
+##' default is NULL. |
|
429 | 431 |
##' @return full tree with zoom in clade |
430 | 432 |
##' @author Guangchuang Yu |
431 | 433 |
##' @export |
432 |
-zoomClade <- function(tree_view = NULL, node) { |
|
434 |
+zoomClade <- function(tree_view = NULL, node, xexpand=NULL) { |
|
433 | 435 |
p <- get_tree_view(tree_view) |
434 | 436 |
sp <- offspring(p, node, self_include=TRUE) |
435 | 437 |
xr <- range(sp$x) |
436 |
- xr[2] <- xr[2] + diff(xr)/10 |
|
438 |
+ if (is.null(xexpand)){ |
|
439 |
+ xr[2] <- xr[2] + diff(xr)/10 |
|
440 |
+ }else{ |
|
441 |
+ xr[2] <- xr[2] + diff(xr)/10 + xr[2]*xexpand |
|
442 |
+ } |
|
437 | 443 |
yr <- range(sp$y) |
438 | 444 |
## nn <- sp$node |
439 | 445 |
## p + ggforce::facet_zoom(y = node %in% nn, ylim = yr) |
... | ... |
@@ -2,8 +2,8 @@ |
2 | 2 |
##' |
3 | 3 |
##' |
4 | 4 |
##' @title get_taxa_name |
5 |
-##' @param tree_view tree view |
|
6 |
-##' @param node node |
|
5 |
+##' @param tree_view tree view (i.e. the ggtree object). If tree_view is NULL, the last ggplot will be used. |
|
6 |
+##' @param node internal node number |
|
7 | 7 |
##' @return taxa name vector |
8 | 8 |
##' @importFrom tidytree offspring |
9 | 9 |
##' @export |
... | ... |
@@ -29,8 +29,7 @@ get_taxa_name <- function(tree_view=NULL, node=NULL) { |
29 | 29 |
##' |
30 | 30 |
##' |
31 | 31 |
##' @title viewClade |
32 |
-##' @param tree_view full tree view |
|
33 |
-##' @param node internal node number |
|
32 |
+##' @inheritParams get_taxa_name |
|
34 | 33 |
##' @param xmax_adjust adjust xmax |
35 | 34 |
##' @return clade plot |
36 | 35 |
##' @importFrom ggplot2 ggplot_build |
... | ... |
@@ -66,8 +65,8 @@ is.viewClade <- function(tree_view) { |
66 | 65 |
##' |
67 | 66 |
##' @title collapse-ggtree |
68 | 67 |
##' @rdname collapse |
69 |
-##' @param x tree view |
|
70 |
-##' @param node clade node |
|
68 |
+##' @param x tree view (i.e. the ggtree object). If tree_view is NULL, the last ggplot will be used. |
|
69 |
+##' @param node internal node number |
|
71 | 70 |
##' @param mode one of 'none', 'max', 'min' and 'mixed' |
72 | 71 |
##' @param clade_name set clade name. If clade_name = NULL, do nothing |
73 | 72 |
##' @param ... additional parameters |
... | ... |
@@ -168,8 +167,7 @@ collapse.ggtree <- function(x=NULL, node, mode = "none", clade_name = NULL, ...) |
168 | 167 |
##' |
169 | 168 |
##' |
170 | 169 |
##' @title expand |
171 |
-##' @param tree_view tree view |
|
172 |
-##' @param node clade node |
|
170 |
+##' @inheritParams get_taxa_name |
|
173 | 171 |
##' @return tree view |
174 | 172 |
##' @export |
175 | 173 |
##' @seealso collapse |
... | ... |
@@ -226,8 +224,7 @@ expand <- function(tree_view=NULL, node) { |
226 | 224 |
##' |
227 | 225 |
##' |
228 | 226 |
##' @title rotate |
229 |
-##' @param tree_view tree view |
|
230 |
-##' @param node selected node |
|
227 |
+##' @inheritParams get_taxa_name |
|
231 | 228 |
##' @return ggplot2 object |
232 | 229 |
##' @export |
233 | 230 |
##' @author Guangchuang Yu |
... | ... |
@@ -268,7 +265,7 @@ rotate <- function(tree_view=NULL, node) { |
268 | 265 |
##' |
269 | 266 |
##' |
270 | 267 |
##' @title flip |
271 |
-##' @param tree_view tree view |
|
268 |
+##' @param tree_view tree view (i.e. the ggtree object). If tree_view is NULL, the last ggplot will be used. |
|
272 | 269 |
##' @param node1 node number of branch 1 |
273 | 270 |
##' @param node2 node number of branch 2 |
274 | 271 |
##' @return ggplot2 object |
... | ... |
@@ -339,8 +336,7 @@ flip <- function(tree_view=NULL, node1, node2) { |
339 | 336 |
##' |
340 | 337 |
##' |
341 | 338 |
##' @title scaleClade |
342 |
-##' @param tree_view tree view |
|
343 |
-##' @param node clade node |
|
339 |
+##' @inheritParams get_taxa_name |
|
344 | 340 |
##' @param scale scale |
345 | 341 |
##' @param vertical_only logical. If TRUE, only vertical will be scaled. |
346 | 342 |
##' If FALSE, the clade will be scaled vertical and horizontally. |
... | ... |
@@ -423,3 +419,25 @@ reassign_y_from_node_to_root <- function(df, node) { |
423 | 419 |
df[pp, "y"] <- mean(df$y[j]) |
424 | 420 |
return(df) |
425 | 421 |
} |
422 |
+ |
|
423 |
+ |
|
424 |
+##' zoom selected clade of a tree |
|
425 |
+##' |
|
426 |
+##' |
|
427 |
+##' @title zoomClade |
|
428 |
+##' @inheritParams get_taxa_name |
|
429 |
+##' @return full tree with zoom in clade |
|
430 |
+##' @author Guangchuang Yu |
|
431 |
+##' @export |
|
432 |
+zoomClade <- function(tree_view = NULL, node) { |
|
433 |
+ p <- get_tree_view(tree_view) |
|
434 |
+ sp <- offspring(p, node, self_include=TRUE) |
|
435 |
+ xr <- range(sp$x) |
|
436 |
+ xr[2] <- xr[2] + diff(xr)/10 |
|
437 |
+ yr <- range(sp$y) |
|
438 |
+ ## nn <- sp$node |
|
439 |
+ ## p + ggforce::facet_zoom(y = node %in% nn, ylim = yr) |
|
440 |
+ facet_zoom <- getFromNamespace("facet_zoom", "ggforce") |
|
441 |
+ |
|
442 |
+ p + facet_zoom(xlim = xr, ylim=yr) |
|
443 |
+} |
... | ... |
@@ -35,6 +35,7 @@ get_taxa_name <- function(tree_view=NULL, node=NULL) { |
35 | 35 |
##' @return clade plot |
36 | 36 |
##' @importFrom ggplot2 ggplot_build |
37 | 37 |
##' @importFrom ggplot2 coord_cartesian |
38 |
+##' @importFrom aplot xrange |
|
38 | 39 |
##' @export |
39 | 40 |
##' @author Guangchuang Yu |
40 | 41 |
viewClade <- function(tree_view=NULL, node, xmax_adjust=0) { |
... | ... |
@@ -42,7 +42,7 @@ viewClade <- function(tree_view=NULL, node, xmax_adjust=0) { |
42 | 42 |
## xd <- tree_view$data$branch.length[node]/2 |
43 | 43 |
|
44 | 44 |
cpos <- get_clade_position(tree_view, node=node) |
45 |
- xmax <- ggplot_build(tree_view)$layout$panel_params[[1]]$x.range[2] |
|
45 |
+ xmax <- xrange(tree_view)[2] |
|
46 | 46 |
|
47 | 47 |
attr(tree_view, 'viewClade') <- TRUE |
48 | 48 |
attr(tree_view, 'viewClade_node') <- node |
... | ... |
@@ -152,7 +152,7 @@ collapse.ggtree <- function(x=NULL, node, mode = "none", clade_name = NULL, ...) |
152 | 152 |
if (mode != "none") { |
153 | 153 |
tree_view <- tree_view + |
154 | 154 |
geom_polygon(mapping = aes_(x = ~x, y = ~y), |
155 |
- data = triangle, ...) |
|
155 |
+ data = triangle, inherit.aes = FALSE, ...) |
|
156 | 156 |
} |
157 | 157 |
|
158 | 158 |
clade <- paste0("collapse_clade_", node) |
... | ... |
@@ -212,8 +212,8 @@ expand <- function(tree_view=NULL, node) { |
212 | 212 |
|
213 | 213 |
tree_view$data <- calculate_angle(df) |
214 | 214 |
} else { |
215 |
- tree_view$data <- dplyr::bind_rows(df, sp.df) %>% |
|
216 |
- dplyr::arrange(.data$node) |
|
215 |
+ df[sp.df$node,] <- sp.df |
|
216 |
+ tree_view$data <- df |
|
217 | 217 |
} |
218 | 218 |
|
219 | 219 |
attr(tree_view, clade) <- NULL |
... | ... |
@@ -138,8 +138,9 @@ collapse.ggtree <- function(x=NULL, node, mode = "none", clade_name = NULL, ...) |
138 | 138 |
y = c(df$y[node], sp_coord$ymin, sp_coord$ymax) |
139 | 139 |
) |
140 | 140 |
) |
141 |
- ## remove collapsed nodes |
|
142 |
- df <- dplyr::filter(df, !.data$node %in% sp.df$node) |
|
141 |
+ |
|
142 |
+ df[sp.df$node, "x"] <- NA |
|
143 |
+ df[sp.df$node, "y"] <- NA |
|
143 | 144 |
} |
144 | 145 |
|
145 | 146 |
## set clade name |
... | ... |
@@ -147,14 +148,18 @@ collapse.ggtree <- function(x=NULL, node, mode = "none", clade_name = NULL, ...) |
147 | 148 |
df$label[node] <- clade_name |
148 | 149 |
|
149 | 150 |
tree_view$data <- df |
150 |
- clade <- paste0("clade_", node) |
|
151 |
- attr(tree_view, clade) <- sp.df |
|
151 |
+ |
|
152 | 152 |
if (mode != "none") { |
153 | 153 |
tree_view <- tree_view + |
154 | 154 |
geom_polygon(mapping = aes_(x = ~x, y = ~y), |
155 | 155 |
data = triangle, ...) |
156 | 156 |
} |
157 | 157 |
|
158 |
+ clade <- paste0("collapse_clade_", node) |
|
159 |
+ mode_attr <- paste0("collapse_mode_", node) |
|
160 |
+ attr(tree_view, clade) <- sp.df |
|
161 |
+ attr(tree_view, mode_attr) <- mode |
|
162 |
+ |
|
158 | 163 |
tree_view |
159 | 164 |
} |
160 | 165 |
|
... | ... |
@@ -171,38 +176,49 @@ collapse.ggtree <- function(x=NULL, node, mode = "none", clade_name = NULL, ...) |
171 | 176 |
expand <- function(tree_view=NULL, node) { |
172 | 177 |
tree_view %<>% get_tree_view |
173 | 178 |
|
174 |
- clade <- paste0("clade_", node) |
|
179 |
+ clade <- paste0("collapse_clade_", node) |
|
175 | 180 |
sp.df <- attr(tree_view, clade) |
181 |
+ mode_attr <- paste0("collapse_mode_", node) |
|
182 |
+ mode <- attr(tree_view, mode_attr) |
|
183 |
+ |
|
176 | 184 |
if (is.null(sp.df)) { |
177 | 185 |
return(tree_view) |
178 | 186 |
} |
179 | 187 |
df <- tree_view$data |
180 |
- ## df[node, "isTip"] <- FALSE |
|
181 |
- sp_y <- range(sp.df$y) |
|
182 |
- ii <- which(df$y > df$y[node]) |
|
183 |
- df[ii, "y"] <- df[ii, "y"] + diff(sp_y) |
|
184 | 188 |
|
185 |
- sp.df$y <- sp.df$y - min(sp.df$y) + df$y[node] |
|
186 |
- df[sp.df$node,] <- sp.df |
|
189 |
+ if (mode == "none") { |
|
190 |
+ ## df[node, "isTip"] <- FALSE |
|
191 |
+ sp_y <- range(sp.df$y) |
|
192 |
+ ii <- which(df$y > df$y[node]) |
|
193 |
+ df[ii, "y"] <- df[ii, "y"] + diff(sp_y) |
|
187 | 194 |
|
188 |
- root <- which(df$node == df$parent) |
|
189 |
- pp <- node |
|
190 |
- while(any(pp != root)) { |
|
191 |
- ## df[pp, "y"] <- mean(df$y[getChild.df(df, pp)]) |
|
192 |
- df[pp, "y"] <- mean(tidytree::child(df, pp)$y) |
|
193 |
- pp <- df$parent[pp] |
|
194 |
- } |
|
195 |
- ## j <- getChild.df(df, pp) |
|
196 |
- j <- tidytree::child(df, pp)$node |
|
197 |
- j <- j[j!=pp] |
|
198 |
- df[pp, "y"] <- mean(df$y[j]) |
|
195 |
+ sp.df$y <- sp.df$y - min(sp.df$y) + df$y[node] |
|
196 |
+ df[sp.df$node,] <- sp.df |
|
197 |
+ |
|
198 |
+ root <- which(df$node == df$parent) |
|
199 |
+ pp <- node |
|
200 |
+ while(any(pp != root)) { |
|
201 |
+ ## df[pp, "y"] <- mean(df$y[getChild.df(df, pp)]) |
|
202 |
+ df[pp, "y"] <- mean(tidytree::child(df, pp)$y) |
|
203 |
+ pp <- df$parent[pp] |
|
204 |
+ } |
|
205 |
+ ## j <- getChild.df(df, pp) |
|
206 |
+ j <- tidytree::child(df, pp)$node |
|
207 |
+ j <- j[j!=pp] |
|
208 |
+ df[pp, "y"] <- mean(df$y[j]) |
|
209 |
+ |
|
210 |
+ ## re-calculate branch mid position |
|
211 |
+ df <- calculate_branch_mid(df) |
|
199 | 212 |
|
200 |
- ## re-calculate branch mid position |
|
201 |
- df <- calculate_branch_mid(df) |
|
213 |
+ tree_view$data <- calculate_angle(df) |
|
214 |
+ } else { |
|
215 |
+ tree_view$data <- dplyr::bind_rows(df, sp.df) %>% |
|
216 |
+ dplyr::arrange(.data$node) |
|
217 |
+ } |
|
202 | 218 |
|
203 |
- tree_view$data <- calculate_angle(df) |
|
204 | 219 |
attr(tree_view, clade) <- NULL |
205 |
- tree_view |
|
220 |
+ attr(tree_view, mode_attr) <- NULL |
|
221 |
+ return(tree_view) |
|
206 | 222 |
} |
207 | 223 |
|
208 | 224 |
##' rotate 180 degree of a selected branch |
... | ... |
@@ -59,6 +59,7 @@ is.viewClade <- function(tree_view) { |
59 | 59 |
|
60 | 60 |
|
61 | 61 |
|
62 |
+ |
|
62 | 63 |
##' collapse a clade |
63 | 64 |
##' |
64 | 65 |
##' |
... | ... |
@@ -66,15 +67,18 @@ is.viewClade <- function(tree_view) { |
66 | 67 |
##' @rdname collapse |
67 | 68 |
##' @param x tree view |
68 | 69 |
##' @param node clade node |
70 |
+##' @param mode one of 'none', 'max', 'min' and 'mixed' |
|
69 | 71 |
##' @param clade_name set clade name. If clade_name = NULL, do nothing |
70 | 72 |
##' @param ... additional parameters |
71 | 73 |
##' @return tree view |
72 | 74 |
##' @method collapse ggtree |
75 |
+##' @importFrom ggplot2 geom_polygon |
|
73 | 76 |
##' @export |
74 | 77 |
##' @seealso expand |
75 | 78 |
##' @author Guangchuang Yu |
76 |
-collapse.ggtree <- function(x=NULL, node, clade_name = NULL, ...) { |
|
79 |
+collapse.ggtree <- function(x=NULL, node, mode = "none", clade_name = NULL, ...) { |
|
77 | 80 |
tree_view <- get_tree_view(x) |
81 |
+ mode <- match.arg(mode, c("none", "max", "min", "mixed")) |
|
78 | 82 |
|
79 | 83 |
df <- tree_view$data |
80 | 84 |
|
... | ... |
@@ -91,24 +95,52 @@ collapse.ggtree <- function(x=NULL, node, clade_name = NULL, ...) { |
91 | 95 |
return(tree_view) |
92 | 96 |
} |
93 | 97 |
|
94 |
- ## df[node, "isTip"] <- TRUE |
|
95 |
- sp_y <- range(sp.df$y, na.rm=TRUE) |
|
96 |
- ii <- which(df$y > max(sp_y)) |
|
97 |
- if (length(ii)) { |
|
98 |
- df$y[ii] <- df$y[ii] - diff(sp_y) |
|
98 |
+ if (mode == "none") { |
|
99 |
+ ## df[node, "isTip"] <- TRUE |
|
100 |
+ sp_y <- range(sp.df$y, na.rm=TRUE) |
|
101 |
+ ii <- which(df$y > max(sp_y)) |
|
102 |
+ if (length(ii)) { |
|
103 |
+ df$y[ii] <- df$y[ii] - diff(sp_y) |
|
104 |
+ } |
|
105 |
+ df$y[node] <- min(sp_y) |
|
106 |
+ |
|
107 |
+ df[sp.df$node, "x"] <- NA |
|
108 |
+ df[sp.df$node, "y"] <- NA |
|
109 |
+ |
|
110 |
+ df <- reassign_y_from_node_to_root(df, node) |
|
111 |
+ |
|
112 |
+ ## re-calculate branch mid position |
|
113 |
+ df <- calculate_branch_mid(df) |
|
114 |
+ |
|
115 |
+ ii <- which(!is.na(df$x)) |
|
116 |
+ df$angle[ii] <- calculate_angle(df[ii,])$angle |
|
117 |
+ } else { |
|
118 |
+ ## reference https://jean.manguy.eu/subtrees-as-triangles-with-ggtree/ |
|
119 |
+ |
|
120 |
+ sp_coord <- dplyr::summarise(sp.df[sp.df$isTip,], |
|
121 |
+ xmax = max(.data$x), |
|
122 |
+ xmin = min(.data$x), |
|
123 |
+ ymax = max(.data$y), |
|
124 |
+ ymin = min(.data$y)) |
|
125 |
+ |
|
126 |
+ triangle <- switch( |
|
127 |
+ mode, |
|
128 |
+ max = tibble::tibble( |
|
129 |
+ x = c(df$x[node], sp_coord$xmax, sp_coord$xmax), |
|
130 |
+ y = c(df$y[node], sp_coord$ymin, sp_coord$ymax) |
|
131 |
+ ), |
|
132 |
+ min = tibble::tibble( |
|
133 |
+ x = c(df$x[node], sp_coord$xmin, sp_coord$xmin), |
|
134 |
+ y = c(df$y[node], sp_coord$ymin, sp_coord$ymax) |
|
135 |
+ ), |
|
136 |
+ mixed = tibble::tibble( |
|
137 |
+ x = c(df$x[node], sp_coord$xmin, sp_coord$xmax), |
|
138 |
+ y = c(df$y[node], sp_coord$ymin, sp_coord$ymax) |
|
139 |
+ ) |
|
140 |
+ ) |
|
141 |
+ ## remove collapsed nodes |
|
142 |
+ df <- dplyr::filter(df, !.data$node %in% sp.df$node) |
|
99 | 143 |
} |
100 |
- df$y[node] <- min(sp_y) |
|
101 |
- |
|
102 |
- df[sp.df$node, "x"] <- NA |
|
103 |
- df[sp.df$node, "y"] <- NA |
|
104 |
- |
|
105 |
- df <- reassign_y_from_node_to_root(df, node) |
|
106 |
- |
|
107 |
- ## re-calculate branch mid position |
|
108 |
- df <- calculate_branch_mid(df) |
|
109 |
- |
|
110 |
- ii <- which(!is.na(df$x)) |
|
111 |
- df$angle[ii] <- calculate_angle(df[ii,])$angle |
|
112 | 144 |
|
113 | 145 |
## set clade name |
114 | 146 |
if (!is.null(clade_name)) |
... | ... |
@@ -117,6 +149,12 @@ collapse.ggtree <- function(x=NULL, node, clade_name = NULL, ...) { |
117 | 149 |
tree_view$data <- df |
118 | 150 |
clade <- paste0("clade_", node) |
119 | 151 |
attr(tree_view, clade) <- sp.df |
152 |
+ if (mode != "none") { |
|
153 |
+ tree_view <- tree_view + |
|
154 |
+ geom_polygon(mapping = aes_(x = ~x, y = ~y), |
|
155 |
+ data = triangle, ...) |
|
156 |
+ } |
|
157 |
+ |
|
120 | 158 |
tree_view |
121 | 159 |
} |
122 | 160 |
|
... | ... |
@@ -86,6 +86,11 @@ collapse.ggtree <- function(x=NULL, node, clade_name = NULL, ...) { |
86 | 86 |
## sp <- get.offspring.df(df, node) |
87 | 87 |
## sp.df <- df[sp,] |
88 | 88 |
sp.df <- offspring(df, node) |
89 |
+ if (nrow(sp.df) == 0) { |
|
90 |
+ warning("input node is a tip...") |
|
91 |
+ return(tree_view) |
|
92 |
+ } |
|
93 |
+ |
|
89 | 94 |
## df[node, "isTip"] <- TRUE |
90 | 95 |
sp_y <- range(sp.df$y, na.rm=TRUE) |
91 | 96 |
ii <- which(df$y > max(sp_y)) |
... | ... |
@@ -145,10 +145,12 @@ expand <- function(tree_view=NULL, node) { |
145 | 145 |
root <- which(df$node == df$parent) |
146 | 146 |
pp <- node |
147 | 147 |
while(any(pp != root)) { |
148 |
- df[pp, "y"] <- mean(df$y[getChild.df(df, pp)]) |
|
148 |
+ ## df[pp, "y"] <- mean(df$y[getChild.df(df, pp)]) |
|
149 |
+ df[pp, "y"] <- mean(tidytree::child(df, pp)$y) |
|
149 | 150 |
pp <- df$parent[pp] |
150 | 151 |
} |
151 |
- j <- getChild.df(df, pp) |
|
152 |
+ ## j <- getChild.df(df, pp) |
|
153 |
+ j <- tidytree::child(df, pp)$node |
|
152 | 154 |
j <- j[j!=pp] |
153 | 155 |
df[pp, "y"] <- mean(df$y[j]) |
154 | 156 |
|
... | ... |
@@ -260,10 +262,11 @@ flip <- function(tree_view=NULL, node1, node2) { |
260 | 262 |
## yy <- df$y[-c(sp1, sp2)] |
261 | 263 |
## df$y[-c(sp1, sp2)] <- yy + ((min(sp2.df$y, na.rm=TRUE) - max(yy)) - (min(yy) - max(sp1.df$y, na.rm=TRUE)))/2 |
262 | 264 |
|
263 |
- anc <- getAncestor.df(df, node1) |
|
265 |
+ anc <- ancestor(df, node1)$node |
|
264 | 266 |
ii <- match(anc, df$node) |
265 | 267 |
df[ii, "y"] <- NA |
266 |
- currentNode <- unlist(as.vector(sapply(anc, getChild.df, df=df))) |
|
268 |
+ ## currentNode <- unlist(as.vector(sapply(anc, getChild.df, df=df))) |
|
269 |
+ currentNode <- unlist(as.vector(sapply(anc, function(.node) tidytree::child(df, .node)$node))) |
|
267 | 270 |
currentNode <- currentNode[!currentNode %in% anc] |
268 | 271 |
|
269 | 272 |
tree_view$data <- re_assign_ycoord_df(df, currentNode) |
... | ... |
@@ -295,7 +298,7 @@ scaleClade <- function(tree_view=NULL, node, scale=1, vertical_only=TRUE) { |
295 | 298 |
df <- tree_view$data |
296 | 299 |
## sp <- get.offspring.df(df, node) |
297 | 300 |
## sp.df <- df[sp,] |
298 |
- sp.df <- offspring(sp, node) |
|
301 |
+ sp.df <- offspring(df, node) |
|
299 | 302 |
sp <- sp.df$node |
300 | 303 |
|
301 | 304 |
## sp_nr <- nrow(sp.df) |
... | ... |
@@ -350,10 +353,12 @@ reassign_y_from_node_to_root <- function(df, node) { |
350 | 353 |
root <- which(df$node == df$parent) |
351 | 354 |
pp <- df$parent[node] |
352 | 355 |
while(any(pp != root)) { |
353 |
- df[pp, "y"] <- mean(df$y[getChild.df(df, pp)]) |
|
356 |
+ ## df[pp, "y"] <- mean(df$y[getChild.df(df, pp)]) |
|
357 |
+ df[pp, "y"] <- mean(tidytree::child(df, pp)$y) |
|
354 | 358 |
pp <- df$parent[pp] |
355 | 359 |
} |
356 |
- j <- getChild.df(df, pp) |
|
360 |
+ ## j <- getChild.df(df, pp) |
|
361 |
+ j <- tidytree::child(df, pp)$node |
|
357 | 362 |
j <- j[j!=pp] |
358 | 363 |
df[pp, "y"] <- mean(df$y[j]) |
359 | 364 |
return(df) |
... | ... |
@@ -5,6 +5,7 @@ |
5 | 5 |
##' @param tree_view tree view |
6 | 6 |
##' @param node node |
7 | 7 |
##' @return taxa name vector |
8 |
+##' @importFrom tidytree offspring |
|
8 | 9 |
##' @export |
9 | 10 |
##' @author Guangchuang Yu |
10 | 11 |
get_taxa_name <- function(tree_view=NULL, node=NULL) { |
... | ... |
@@ -12,8 +13,9 @@ get_taxa_name <- function(tree_view=NULL, node=NULL) { |
12 | 13 |
|
13 | 14 |
df <- tree_view$data |
14 | 15 |
if (!is.null(node)) { |
15 |
- sp <- get.offspring.df(df, node) |
|
16 |
- df <- df[sp, ] |
|
16 |
+ ## sp <- get.offspring.df(df, node) |
|
17 |
+ ## df <- df[sp, ] |
|
18 |
+ df <- offspring(df, node) |
|
17 | 19 |
} |
18 | 20 |
|
19 | 21 |
with(df, { |
... | ... |
@@ -81,8 +83,9 @@ collapse.ggtree <- function(x=NULL, node, clade_name = NULL, ...) { |
81 | 83 |
return(tree_view) |
82 | 84 |
} |
83 | 85 |
|
84 |
- sp <- get.offspring.df(df, node) |
|
85 |
- sp.df <- df[sp,] |
|
86 |
+ ## sp <- get.offspring.df(df, node) |
|
87 |
+ ## sp.df <- df[sp,] |
|
88 |
+ sp.df <- offspring(df, node) |
|
86 | 89 |
## df[node, "isTip"] <- TRUE |
87 | 90 |
sp_y <- range(sp.df$y, na.rm=TRUE) |
88 | 91 |
ii <- which(df$y > max(sp_y)) |
... | ... |
@@ -91,8 +94,8 @@ collapse.ggtree <- function(x=NULL, node, clade_name = NULL, ...) { |
91 | 94 |
} |
92 | 95 |
df$y[node] <- min(sp_y) |
93 | 96 |
|
94 |
- df[sp, "x"] <- NA |
|
95 |
- df[sp, "y"] <- NA |
|
97 |
+ df[sp.df$node, "x"] <- NA |
|
98 |
+ df[sp.df$node, "y"] <- NA |
|
96 | 99 |
|
97 | 100 |
df <- reassign_y_from_node_to_root(df, node) |
98 | 101 |
|
... | ... |
@@ -170,10 +173,15 @@ rotate <- function(tree_view=NULL, node) { |
170 | 173 |
tree_view %<>% get_tree_view |
171 | 174 |
|
172 | 175 |
df <- tree_view$data |
173 |
- sp <- get.offspring.df(df, node) |
|
176 |
+ ## sp <- get.offspring.df(df, node) |
|
177 |
+ ## sp_idx <- with(df, match(sp, node)) |
|
178 |
+ ## tip <- sp[df$isTip[sp_idx]] |
|
179 |
+ ## sp.df <- df[sp_idx,] |
|
180 |
+ sp.df <- offspring(df, node) |
|
181 |
+ sp <- sp.df$node |
|
174 | 182 |
sp_idx <- with(df, match(sp, node)) |
175 | 183 |
tip <- sp[df$isTip[sp_idx]] |
176 |
- sp.df <- df[sp_idx,] |
|
184 |
+ |
|
177 | 185 |
ii <- with(sp.df, match(tip, node)) |
178 | 186 |
jj <- ii[order(sp.df$y[ii])] |
179 | 187 |
sp.df[jj,"y"] <- rev(sp.df$y[jj]) |
... | ... |
@@ -215,11 +223,16 @@ flip <- function(tree_view=NULL, node1, node2) { |
215 | 223 |
stop("node1 and node2 should share a same parent node...") |
216 | 224 |
} |
217 | 225 |
|
218 |
- sp1 <- c(node1, get.offspring.df(df, node1)) |
|
219 |
- sp2 <- c(node2, get.offspring.df(df, node2)) |
|
226 |
+ ## sp1 <- c(node1, get.offspring.df(df, node1)) |
|
227 |
+ ## sp2 <- c(node2, get.offspring.df(df, node2)) |
|
228 |
+ |
|
229 |
+ ## sp1.df <- df[sp1,] |
|
230 |
+ ## sp2.df <- df[sp2,] |
|
220 | 231 |
|
221 |
- sp1.df <- df[sp1,] |
|
222 |
- sp2.df <- df[sp2,] |
|
232 |
+ sp1.df <- offspring(df, node1, self_include = TRUE) |
|
233 |
+ sp2.df <- offspring(df, node2, self_include = TRUE) |
|
234 |
+ sp1 <- sp1.df$node |
|
235 |
+ sp2 <- sp2.df$node |
|
223 | 236 |
|
224 | 237 |
min_y1 <- min(sp1.df$y, na.rm=TRUE) |
225 | 238 |
min_y2 <- min(sp2.df$y, na.rm=TRUE) |
... | ... |
@@ -280,9 +293,11 @@ scaleClade <- function(tree_view=NULL, node, scale=1, vertical_only=TRUE) { |
280 | 293 |
} |
281 | 294 |
|
282 | 295 |
df <- tree_view$data |
283 |
- sp <- get.offspring.df(df, node) |
|
284 |
- sp.df <- df[sp,] |
|
285 |
- |
|
296 |
+ ## sp <- get.offspring.df(df, node) |
|
297 |
+ ## sp.df <- df[sp,] |
|
298 |
+ sp.df <- offspring(sp, node) |
|
299 |
+ sp <- sp.df$node |
|
300 |
+ |
|
286 | 301 |
## sp_nr <- nrow(sp.df) |
287 | 302 |
## span <- diff(range(sp.df$y))/sp_nr |
288 | 303 |
|
... | ... |
@@ -40,7 +40,7 @@ viewClade <- function(tree_view=NULL, node, xmax_adjust=0) { |
40 | 40 |
## xd <- tree_view$data$branch.length[node]/2 |
41 | 41 |
|
42 | 42 |
cpos <- get_clade_position(tree_view, node=node) |
43 |
- xmax <- ggplot_build(tree_view)$layout$panel_ranges[[1]]$x.range[2] |
|
43 |
+ xmax <- ggplot_build(tree_view)$layout$panel_params[[1]]$x.range[2] |
|
44 | 44 |
|
45 | 45 |
attr(tree_view, 'viewClade') <- TRUE |
46 | 46 |
attr(tree_view, 'viewClade_node') <- node |
... | ... |
@@ -46,7 +46,8 @@ viewClade <- function(tree_view=NULL, node, xmax_adjust=0) { |
46 | 46 |
attr(tree_view, 'viewClade_node') <- node |
47 | 47 |
|
48 | 48 |
## tree_view+xlim(cpos$xmin, xmax + xmax_adjust) + ylim(cpos$ymin, cpos$ymax) |
49 |
- tree_view + coord_cartesian(xlim=c(cpos$xmin, xmax), ylim=c(cpos$ymin, cpos$ymax), expand=FALSE) |
|
49 |
+ tree_view + coord_cartesian(xlim=c(cpos$xmin, xmax + xmax_adjust), |
|
50 |
+ ylim=c(cpos$ymin, cpos$ymax), expand=FALSE) |
|
50 | 51 |
} |
51 | 52 |
|
52 | 53 |
is.viewClade <- function(tree_view) { |
... | ... |
@@ -63,13 +63,14 @@ is.viewClade <- function(tree_view) { |
63 | 63 |
##' @rdname collapse |
64 | 64 |
##' @param x tree view |
65 | 65 |
##' @param node clade node |
66 |
+##' @param clade_name set clade name. If clade_name = NULL, do nothing |
|
66 | 67 |
##' @param ... additional parameters |
67 | 68 |
##' @return tree view |
68 | 69 |
##' @method collapse ggtree |
69 | 70 |
##' @export |
70 | 71 |
##' @seealso expand |
71 | 72 |
##' @author Guangchuang Yu |
72 |
-collapse.ggtree <- function(x=NULL, node, ...) { |
|
73 |
+collapse.ggtree <- function(x=NULL, node, clade_name = NULL, ...) { |
|
73 | 74 |
tree_view <- get_tree_view(x) |
74 | 75 |
|
75 | 76 |
df <- tree_view$data |
... | ... |
@@ -100,6 +101,10 @@ collapse.ggtree <- function(x=NULL, node, ...) { |
100 | 101 |
ii <- which(!is.na(df$x)) |
101 | 102 |
df$angle[ii] <- calculate_angle(df[ii,])$angle |
102 | 103 |
|
104 |
+ ## set clade name |
|
105 |
+ if (!is.null(clade_name)) |
|
106 |
+ df$label[node] <- clade_name |
|
107 |
+ |
|
103 | 108 |
tree_view$data <- df |
104 | 109 |
clade <- paste0("clade_", node) |
105 | 110 |
attr(tree_view, clade) <- sp.df |
... | ... |
@@ -234,11 +234,12 @@ flip <- function(tree_view=NULL, node1, node2) { |
234 | 234 |
sp1.df$y <- sp1.df$y - abs(min_y1 - min_y2) |
235 | 235 |
sp2.df$y <- sp2.df$y + max(sp1.df$y, na.rm=TRUE) + space - min(sp2.df$y, na.rm=TRUE) |
236 | 236 |
|
237 |
+ |
|
237 | 238 |
df[sp1, "y"] <- sp1.df$y |
238 | 239 |
df[sp2, "y"] <- sp2.df$y |
239 | 240 |
|
240 |
- yy <- df$y[-c(sp1, sp2)] |
|
241 |
- df$y[-c(sp1, sp2)] <- yy + ((min(sp2.df$y, na.rm=TRUE) - max(yy)) - (min(yy) - max(sp1.df$y, na.rm=TRUE)))/2 |
|
241 |
+ ## yy <- df$y[-c(sp1, sp2)] |
|
242 |
+ ## df$y[-c(sp1, sp2)] <- yy + ((min(sp2.df$y, na.rm=TRUE) - max(yy)) - (min(yy) - max(sp1.df$y, na.rm=TRUE)))/2 |
|
242 | 243 |
|
243 | 244 |
anc <- getAncestor.df(df, node1) |
244 | 245 |
ii <- match(anc, df$node) |
... | ... |
@@ -215,8 +215,8 @@ flip <- function(tree_view=NULL, node1, node2) { |
215 | 215 |
sp1.df <- df[sp1,] |
216 | 216 |
sp2.df <- df[sp2,] |
217 | 217 |
|
218 |
- min_y1 <- min(sp1.df$y) |
|
219 |
- min_y2 <- min(sp2.df$y) |
|
218 |
+ min_y1 <- min(sp1.df$y, na.rm=TRUE) |
|
219 |
+ min_y2 <- min(sp2.df$y, na.rm=TRUE) |
|
220 | 220 |
|
221 | 221 |
if (min_y1 < min_y2) { |
222 | 222 |
tmp <- sp1.df |
... | ... |
@@ -227,16 +227,19 @@ flip <- function(tree_view=NULL, node1, node2) { |
227 | 227 |
sp2 <- tmp |
228 | 228 |
} |
229 | 229 |
|
230 |
- min_y1 <- min(sp1.df$y) |
|
231 |
- min_y2 <- min(sp2.df$y) |
|
230 |
+ min_y1 <- min(sp1.df$y, na.rm=TRUE) |
|
231 |
+ min_y2 <- min(sp2.df$y, na.rm=TRUE) |
|
232 | 232 |
|
233 |
- space <- min(sp1.df$y) - max(sp2.df$y) |
|
233 |
+ space <- min(sp1.df$y, na.rm=TRUE) - max(sp2.df$y, na.rm=TRUE) |
|
234 | 234 |
sp1.df$y <- sp1.df$y - abs(min_y1 - min_y2) |
235 |
- sp2.df$y <- sp2.df$y + max(sp1.df$y) + space - min(sp2.df$y) |
|
235 |
+ sp2.df$y <- sp2.df$y + max(sp1.df$y, na.rm=TRUE) + space - min(sp2.df$y, na.rm=TRUE) |
|
236 | 236 |
|
237 | 237 |
df[sp1, "y"] <- sp1.df$y |
238 | 238 |
df[sp2, "y"] <- sp2.df$y |
239 | 239 |
|
240 |
+ yy <- df$y[-c(sp1, sp2)] |
|
241 |
+ df$y[-c(sp1, sp2)] <- yy + ((min(sp2.df$y, na.rm=TRUE) - max(yy)) - (min(yy) - max(sp1.df$y, na.rm=TRUE)))/2 |
|
242 |
+ |
|
240 | 243 |
anc <- getAncestor.df(df, node1) |
241 | 244 |
ii <- match(anc, df$node) |
242 | 245 |
df[ii, "y"] <- NA |