Browse code

update man files and fixed R check

Guangchuang Yu authored on 23/03/2022 04:13:34
Showing 1 changed files
... ...
@@ -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
Browse code

Document update

Document update

William Lee authored on 22/03/2022 14:46:29
Showing 1 changed files
... ...
@@ -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)
Browse code

branch.x and branch.y for branch label of unrooted layout

xiangpin authored on 11/06/2021 08:26:23
Showing 1 changed files
... ...
@@ -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
 
Browse code

update man

Guangchuang Yu authored on 30/08/2020 09:34:25
Showing 1 changed files
... ...
@@ -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]]
Browse code

add xexpand parameter to expand x to visualize the annotation of tip when zoom

xiangpin authored on 25/08/2020 01:40:50
Showing 1 changed files
... ...
@@ -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)
Browse code

zoomClade and geom_zoom_clade

Guangchuang Yu authored on 03/08/2020 16:21:17
Showing 1 changed files
... ...
@@ -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
+}
Browse code

import xrange from aplot

Guangchuang Yu authored on 07/04/2020 09:39:43
Showing 1 changed files
... ...
@@ -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) {
Browse code

roxygen2md

Guangchuang Yu authored on 01/11/2019 04:24:00
Showing 1 changed files
... ...
@@ -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
Browse code

update layouts

Guangchuang Yu authored on 29/08/2019 16:24:50
Showing 1 changed files
... ...
@@ -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)
Browse code

update expand

Guangchuang Yu authored on 11/07/2019 09:03:30
Showing 1 changed files
... ...
@@ -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
Browse code

allow multiple collapse for different mode

Guangchuang Yu authored on 11/07/2019 08:59:20
Showing 1 changed files
... ...
@@ -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
Browse code

mode paramter in collapse

Guangchuang Yu authored on 11/07/2019 05:43:27
Showing 1 changed files
... ...
@@ -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
 
Browse code

do nothing if collapsing tip, #23

Guangchuang Yu authored on 27/06/2019 04:52:04
Showing 1 changed files
... ...
@@ -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))
Browse code

clean up code

Guangchuang Yu authored on 30/01/2019 12:53:00
Showing 1 changed files
... ...
@@ -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)
Browse code

remove get.offspring.df & get.offspring.tip

Guangchuang Yu authored on 28/01/2019 09:12:15
Showing 1 changed files
... ...
@@ -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
 
Browse code

bug fixed of viewClade

Guangchuang Yu authored on 07/08/2018 12:07:15
Showing 1 changed files
... ...
@@ -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
Browse code

fixed #187

guangchuang yu authored on 21/07/2018 07:18:56
Showing 1 changed files
... ...
@@ -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) {
Browse code

clade_name paramter in collapse

guangchuang yu authored on 28/05/2018 03:02:54
Showing 1 changed files
... ...
@@ -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
Browse code

fixed #167

guangchuang yu authored on 24/02/2018 10:18:39
Showing 1 changed files
... ...
@@ -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)
Browse code

fine tune y position after flip; flip compatible with collapse

guangchuang yu authored on 22/01/2018 07:28:03
Showing 1 changed files
... ...
@@ -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
Browse code

update vignettes

guangchuang yu authored on 03/01/2018 09:55:53
Showing 1 changed files
... ...
@@ -59,15 +59,18 @@ is.viewClade <- function(tree_view) {
59 59
 ##' collapse a clade
60