Browse code

better viewClade

guangchuang yu authored on 28/12/2016 08:08:07
Showing 3 changed files

... ...
@@ -123,6 +123,7 @@ importFrom(ggplot2,aes_)
123 123
 importFrom(ggplot2,aes_string)
124 124
 importFrom(ggplot2,annotate)
125 125
 importFrom(ggplot2,annotation_custom)
126
+importFrom(ggplot2,coord_cartesian)
126 127
 importFrom(ggplot2,coord_flip)
127 128
 importFrom(ggplot2,coord_polar)
128 129
 importFrom(ggplot2,draw_key_path)
... ...
@@ -141,6 +142,7 @@ importFrom(ggplot2,geom_text)
141 142
 importFrom(ggplot2,geom_tile)
142 143
 importFrom(ggplot2,ggplot)
143 144
 importFrom(ggplot2,ggplotGrob)
145
+importFrom(ggplot2,ggplot_build)
144 146
 importFrom(ggplot2,ggproto)
145 147
 importFrom(ggplot2,guide_legend)
146 148
 importFrom(ggplot2,guides)
... ...
@@ -1,7 +1,8 @@
1 1
 CHANGES IN VERSION 1.7.5
2 2
 ------------------------
3
+ o improve viewClade function, use coord_cartesian instead of xlim <2016-12-28, Wed>
3 4
  o remove codes that move to treeio and now ggtree depends treeio <2016-12-20, Tue>
4
- 
5
+
5 6
 CHANGES IN VERSION 1.7.4
6 7
 ------------------------
7 8
  o is.ggtree function to test whether object is produced by ggtree <2016-12-06, Tue>
... ...
@@ -1,6 +1,6 @@
1 1
 ##' get taxa name of a selected node
2 2
 ##'
3
-##' 
3
+##'
4 4
 ##' @title get_taxa_name
5 5
 ##' @param tree_view tree view
6 6
 ##' @param node node
... ...
@@ -9,7 +9,7 @@
9 9
 ##' @author Guangchuang Yu
10 10
 get_taxa_name <- function(tree_view=NULL, node) {
11 11
     tree_view %<>% get_tree_view
12
-    
12
+
13 13
     df <- tree_view$data
14 14
     sp <- get.offspring.df(df, node)
15 15
     res <- df[sp, "label"]
... ...
@@ -21,42 +21,48 @@ get_taxa_name <- function(tree_view=NULL, node) {
21 21
 
22 22
 ##' view a clade of tree
23 23
 ##'
24
-##' 
24
+##'
25 25
 ##' @title viewClade
26
-##' @param tree_view full tree view 
26
+##' @param tree_view full tree view
27 27
 ##' @param node internal node number
28 28
 ##' @param xmax_adjust adjust xmax
29 29
 ##' @return clade plot
30
+##' @importFrom ggplot2 ggplot_build
31
+##' @importFrom ggplot2 coord_cartesian
30 32
 ##' @export
31 33
 ##' @author Guangchuang Yu
32 34
 viewClade <- function(tree_view=NULL, node, xmax_adjust=0) {
33 35
     tree_view %<>% get_tree_view
34
-    
36
+
35 37
     cpos <- get_clade_position(tree_view, node=node)
36
-    with(cpos, tree_view+xlim(xmin, xmax*1.01 + xmax_adjust) + ylim(ymin, ymax))
38
+    xmax <- ggplot_build(tree_view)$layout$panel_ranges[[1]]$x.range[2]
39
+
40
+    ## tree_view+xlim(cpos$xmin, xmax + xmax_adjust) + ylim(cpos$ymin, cpos$ymax)
41
+    tree_view + coord_cartesian(xlim=c(cpos$xmin, xmax), ylim=c(cpos$ymin, cpos$ymax))
37 42
 }
38 43
 
39 44
 
45
+
40 46
 ##' collapse a clade
41 47
 ##'
42
-##' 
48
+##'
43 49
 ##' @title collapse
44
-##' @param tree_view tree view 
50
+##' @param tree_view tree view
45 51
 ##' @param node clade node
46 52
 ##' @return tree view
47 53
 ##' @export
48 54
 ##' @seealso expand
49 55
 ##' @author Guangchuang Yu
50
-collapse <- function(tree_view=NULL, node) {    
56
+collapse <- function(tree_view=NULL, node) {
51 57
     tree_view %<>% get_tree_view
52
-    
58
+
53 59
     df <- tree_view$data
54 60
 
55 61
     if (is.na(df$x[df$node == node])) {
56 62
         warning("specific node was already collapsed...")
57 63
         return(tree_view)
58 64
     }
59
-    
65
+
60 66
     sp <- get.offspring.df(df, node)
61 67
     sp.df <- df[sp,]
62 68
     df[node, "isTip"] <- TRUE
... ...
@@ -69,15 +75,15 @@ collapse <- function(tree_view=NULL, node) {
69 75
 
70 76
     df[sp, "x"] <- NA
71 77
     df[sp, "y"] <- NA
72
-    
78
+
73 79
     df <- reassign_y_from_node_to_root(df, node)
74
-    
80
+
75 81
     ## re-calculate branch mid position
76 82
     df <- calculate_branch_mid(df)
77 83
 
78 84
     ii <- which(!is.na(df$x))
79 85
     df$angle[ii] <- calculate_angle(df[ii,])$angle
80
-    
86
+
81 87
     tree_view$data <- df
82 88
     clade <- paste0("clade_", node)
83 89
     attr(tree_view, clade) <- sp.df
... ...
@@ -86,7 +92,7 @@ collapse <- function(tree_view=NULL, node) {
86 92
 
87 93
 ##' expand collased clade
88 94
 ##'
89
-##' 
95
+##'
90 96
 ##' @title expand
91 97
 ##' @param tree_view tree view
92 98
 ##' @param node clade node
... ...
@@ -96,7 +102,7 @@ collapse <- function(tree_view=NULL, node) {
96 102
 ##' @author Guangchuang Yu
97 103
 expand <- function(tree_view=NULL, node) {
98 104
     tree_view %<>% get_tree_view
99
-    
105
+
100 106
     clade <- paste0("clade_", node)
101 107
     sp.df <- attr(tree_view, clade)
102 108
     if (is.null(sp.df)) {
... ...
@@ -107,7 +113,7 @@ expand <- function(tree_view=NULL, node) {
107 113
     sp_y <- range(sp.df$y)
108 114
     ii <- which(df$y > df$y[node])
109 115
     df[ii, "y"] <- df[ii, "y"] + diff(sp_y)
110
-    
116
+
111 117
     sp.df$y <- sp.df$y - min(sp.df$y) + df$y[node]
112 118
     df[sp.df$node,] <- sp.df
113 119
 
... ...
@@ -123,7 +129,7 @@ expand <- function(tree_view=NULL, node) {
123 129
 
124 130
     ## re-calculate branch mid position
125 131
     df <- calculate_branch_mid(df)
126
-    
132
+
127 133
     tree_view$data <- calculate_angle(df)
128 134
     attr(tree_view, clade) <- NULL
129 135
     tree_view
... ...
@@ -131,16 +137,16 @@ expand <- function(tree_view=NULL, node) {
131 137
 
132 138
 ##' rotate 180 degree of a selected branch
133 139
 ##'
134
-##' 
140
+##'
135 141
 ##' @title rotate
136
-##' @param tree_view tree view 
142
+##' @param tree_view tree view
137 143
 ##' @param node selected node
138 144
 ##' @return ggplot2 object
139 145
 ##' @export
140 146
 ##' @author Guangchuang Yu
141 147
 rotate <- function(tree_view=NULL, node) {
142 148
     tree_view %<>% get_tree_view
143
-    
149
+
144 150
     df <- tree_view$data
145 151
     sp <- get.offspring.df(df, node)
146 152
     sp_idx <- with(df, match(sp, node))
... ...
@@ -168,9 +174,9 @@ rotate <- function(tree_view=NULL, node) {
168 174
 
169 175
 ##' flip position of two selected branches
170 176
 ##'
171
-##' 
177
+##'
172 178
 ##' @title flip
173
-##' @param tree_view tree view 
179
+##' @param tree_view tree view
174 180
 ##' @param node1 node number of branch 1
175 181
 ##' @param node2 node number of branch 2
176 182
 ##' @return ggplot2 object
... ...
@@ -178,7 +184,7 @@ rotate <- function(tree_view=NULL, node) {
178 184
 ##' @author Guangchuang Yu
179 185
 flip <- function(tree_view=NULL, node1, node2) {
180 186
     tree_view %<>% get_tree_view
181
-    
187
+
182 188
     df <- tree_view$data
183 189
     p1 <- with(df, parent[node == node1])
184 190
     p2 <- with(df, parent[node == node2])
... ...
@@ -220,7 +226,7 @@ flip <- function(tree_view=NULL, node1, node2) {
220 226
     df[ii, "y"] <- NA
221 227
     currentNode <- unlist(as.vector(sapply(anc, getChild.df, df=df)))
222 228
     currentNode <- currentNode[!currentNode %in% anc]
223
-    
229
+
224 230
     tree_view$data <- re_assign_ycoord_df(df, currentNode)
225 231
     tree_view$data <- calculate_angle(tree_view$data)
226 232
     tree_view
... ...
@@ -229,7 +235,7 @@ flip <- function(tree_view=NULL, node1, node2) {
229 235
 
230 236
 ##' scale clade
231 237
 ##'
232
-##' 
238
+##'
233 239
 ##' @title scaleClade
234 240
 ##' @param tree_view tree view
235 241
 ##' @param node clade node
... ...
@@ -242,50 +248,50 @@ flip <- function(tree_view=NULL, node1, node2) {
242 248
 ##' @author Guangchuang Yu
243 249
 scaleClade <- function(tree_view=NULL, node, scale=1, vertical_only=TRUE) {
244 250
     tree_view %<>% get_tree_view
245
-    
251
+
246 252
     if (scale == 1) {
247 253
         return(tree_view)
248 254
     }
249
-    
255
+
250 256
     df <- tree_view$data
251 257
     sp <- get.offspring.df(df, node)
252 258
     sp.df <- df[sp,]
253
-    
259
+
254 260
     ## sp_nr <- nrow(sp.df)
255 261
     ## span <- diff(range(sp.df$y))/sp_nr
256
-    
262
+
257 263
     ## new_span <- span * scale
258 264
     old.sp.df <- sp.df
259 265
     sp.df$y <- df[node, "y"] + (sp.df$y - df[node, "y"]) * scale
260 266
     if (! vertical_only) {
261 267
         sp.df$x <- df[node, "x"] + (sp.df$x - df[node, "x"]) * scale
262 268
     }
263
-    
269
+
264 270
     scale_diff.up <- max(sp.df$y) - max(old.sp.df$y)
265 271
     scale_diff.lw <- min(sp.df$y) - min(old.sp.df$y)
266
-    
272
+
267 273
     ii <- df$y > max(old.sp.df$y)
268 274
     if (sum(ii) > 0) {
269 275
         df[ii, "y"] <- df[ii, "y"] + scale_diff.up
270 276
     }
271
-    
277
+
272 278
     jj <- df$y < min(old.sp.df$y)
273 279
     if (sum(jj) > 0) {
274 280
         df[jj, "y"] <- df[jj, "y"] + scale_diff.lw
275 281
     }
276
-    
282
+
277 283
     df[sp,] <- sp.df
278
-    
284
+
279 285
     if (! "scale" %in% colnames(df)) {
280 286
         df$scale <- 1
281 287
     }
282 288
     df[sp, "scale"] <- df[sp, "scale"] * scale
283 289
 
284 290
     df <- reassign_y_from_node_to_root(df, node)
285
-    
291
+
286 292
     ## re-calculate branch mid position
287 293
     df <- calculate_branch_mid(df)
288
-    
294
+
289 295
     tree_view$data <- calculate_angle(df)
290 296
     tree_view
291 297
 }