20
20
# ' @param cut_labels when `cut_p_value` is `TRUE`, this option set the labels.
21
21
# ' @param fill_scale a `Scale` object generated by `ggplot2` package to
22
22
# ' set color for continuous values.
23
- # ' @param cluster_row if `TRUE`, cluster rows with Hierarchical Clustering ('complete' method).
23
+ # ' @param cluster_row,cluster_col if `TRUE`, cluster rows (or columns) with Hierarchical Clustering ('complete' method).
24
24
# ' @param ... other parameters passing to [ggplot2::facet_wrap], only used
25
25
# ' when `return_list` is `FALSE`.
26
26
# '
@@ -40,12 +40,13 @@ show_group_enrichment <- function(df_enrich,
40
40
midpoint = ifelse(fill_by_p_value , 0 , 1 )
41
41
),
42
42
cluster_row = FALSE ,
43
+ cluster_col = FALSE ,
43
44
... ) {
44
45
if (fill_by_p_value ) {
45
46
df_enrich $ p_value_up <- if (use_fdr ) {
46
- ifelse(df_enrich $ fdr == 0 , abs(log10(df_enrich $ fdr + .Machine $ double.xmin )), abs(log10(df_enrich $ fdr )))
47
+ ifelse(df_enrich $ fdr == 0 , abs(log10(df_enrich $ fdr + .Machine $ double.xmin )), abs(log10(df_enrich $ fdr )))
47
48
} else {
48
- ifelse(df_enrich $ p_value == 0 , abs(log10(df_enrich $ p_value + .Machine $ double.xmin )), abs(log10(df_enrich $ p_value )))
49
+ ifelse(df_enrich $ p_value == 0 , abs(log10(df_enrich $ p_value + .Machine $ double.xmin )), abs(log10(df_enrich $ p_value )))
49
50
}
50
51
df_enrich $ p_value_up <- data.table :: fifelse(
51
52
df_enrich $ measure_observed > = 1 ,
@@ -68,7 +69,8 @@ show_group_enrichment <- function(df_enrich,
68
69
cut_labels = cut_labels ,
69
70
add_text_annotation = add_text_annotation ,
70
71
use_fdr = use_fdr ,
71
- cluster_row = cluster_row
72
+ cluster_row = cluster_row ,
73
+ cluster_col = cluster_col
72
74
)
73
75
) - > xx
74
76
p <- xx $ gg
@@ -83,7 +85,8 @@ show_group_enrichment <- function(df_enrich,
83
85
cut_labels = cut_labels ,
84
86
add_text_annotation = add_text_annotation ,
85
87
use_fdr = use_fdr ,
86
- cluster_row = cluster_row
88
+ cluster_row = cluster_row ,
89
+ cluster_col = cluster_col
87
90
) +
88
91
facet_wrap(~ grp_var , scales = scales , ... )
89
92
}
@@ -98,7 +101,8 @@ plot_enrichment_simple <- function(data, x, y, fill_scale,
98
101
cut_labels = c(" < -10" , " < -1.3" , " nosig" , " > 1.3" , " > 10" ),
99
102
add_text_annotation = TRUE ,
100
103
use_fdr = TRUE ,
101
- cluster_row = FALSE ) {
104
+ cluster_row = FALSE ,
105
+ cluster_col = FALSE ) {
102
106
if (fill_by_p_value ) {
103
107
data $ measure_observed <- round(data $ measure_observed , 2 )
104
108
} else {
@@ -116,30 +120,68 @@ plot_enrichment_simple <- function(data, x, y, fill_scale,
116
120
)
117
121
}
118
122
123
+ get_cluster_order <- function (x , bycol = FALSE ) {
124
+ x <- x %> %
125
+ tibble :: column_to_rownames(" grp1" )
126
+ if (min(dim(x )) < 2 ) {
127
+ # warning("clustering is auto-disabled when any dim <2.", immediate. = TRUE)
128
+ message(" clustering is auto-disabled when any dim <2." )
129
+ return (rownames(x ))
130
+ }
131
+
132
+ if (bycol ) x = t(x )
133
+ obj <- x %> %
134
+ scale() %> %
135
+ stats :: dist() %> %
136
+ stats :: hclust() %> %
137
+ stats :: as.dendrogram()
138
+ rownames(x )[stats :: order.dendrogram(obj )]
139
+ }
140
+
119
141
# 支持行聚类(subgroup)
120
142
if (isTRUE(cluster_row )) {
121
- data2 <- data [, c(x , y , " grp_var" , " measure_observed" ), with = F ]
143
+ has_grp_var = " grp_var" %in% colnames(data )
144
+ data2 <- data [, c(x , y , if (has_grp_var ) " grp_var" , " measure_observed" ), with = F ]
122
145
data2 <- tidyr :: pivot_wider(data2 , names_from = x , values_from = " measure_observed" )
123
146
124
- get_cluster_order <- function ( x ) {
125
- x <- x %> %
126
- tibble :: column_to_rownames( " grp1 " )
127
- obj <- x %> %
128
- scale( ) %> %
129
- stats :: dist() % > %
130
- stats :: hclust() % > %
131
- stats :: as.dendrogram()
132
- rownames( x )[ stats :: order.dendrogram( obj )]
147
+ if ( has_grp_var ) {
148
+ orders <- data2 %> %
149
+ dplyr :: group_split( .data $ grp_var , .keep = FALSE ) % > %
150
+ purrr :: map( get_cluster_order ) %> %
151
+ purrr :: reduce( c ) %> %
152
+ unique()
153
+ } else {
154
+ orders <- get_cluster_order( data2 ) | >
155
+ unique()
133
156
}
134
- orders <- data2 %> %
135
- dplyr :: group_split(.data $ grp_var , .keep = FALSE ) %> %
136
- purrr :: map(get_cluster_order ) %> %
137
- purrr :: reduce(c ) %> %
138
- unique()
139
- message(" All subgroup orders: " , paste(orders , collapse = " , " ))
157
+
158
+ message(" subgroup orders: " , paste(orders , collapse = " , " ))
140
159
data $ grp1 <- factor (data $ grp1 , levels = orders )
141
160
}
142
161
162
+ # 支持列聚类(variable)
163
+ if (isTRUE(cluster_col )) {
164
+ has_grp_var = " grp_var" %in% colnames(data )
165
+ data2 <- data [, c(x , y , if (has_grp_var ) " grp_var" , " measure_observed" ), with = F ]
166
+ data2 <- tidyr :: pivot_wider(data2 , names_from = x , values_from = " measure_observed" )
167
+
168
+ if (has_grp_var ) {
169
+ orders <- data2 %> %
170
+ dplyr :: group_split(.data $ grp_var , .keep = FALSE ) %> %
171
+ purrr :: map(get_cluster_order , bycol = TRUE ) %> %
172
+ purrr :: reduce(c ) %> %
173
+ unique()
174
+ } else {
175
+ orders <- get_cluster_order(data2 , bycol = TRUE ) | >
176
+ unique()
177
+ }
178
+
179
+ message(" variable orders: " , paste(orders , collapse = " , " ))
180
+ # 如果有多个 grp_var,enrich_var的顺序会在不同的grp_var中不同,仅使用第一个
181
+ message(" - clustering column is suitable for case with one grp_var or return_list is TRUE." )
182
+ data $ enrich_var <- factor (data $ enrich_var , levels = orders )
183
+ }
184
+
143
185
p <- ggplot(
144
186
data ,
145
187
aes_string(
0 commit comments