--- a +++ b/R/3-3.plot.R @@ -0,0 +1,710 @@ +# ========4.plot======== + + +#' Plot a metanet +#' +#' @param x metanet object +#' @param ... add +#' +#' @return plot +#' @exportS3Method +#' @method plot metanet +plot.metanet <- function(x, ...) { + # 具有n_type的metanet的默认参数记录在这里,用于快速绘图。 + go <- x + if (is.null(get_n(go)$n_type)) { + c_net_plot(go, ...) + } else if (get_n(go)$n_type == "skeleton") { + skeleton_plot(go, ...) + } else if (get_n(go)$n_type == "module") { + default_arg <- list( + labels_num = 0, + group_legend_title = "Module" + ) + do.call(c_net_plot, append(list(go = go), pcutils::update_param(default_arg, list(...)))) + } else if (get_n(go)$n_type == "venn") { + nice_size <- ceiling(60 / sqrt(length(V(go)))) + 1 + default_arg <- list( + labels_num = "all", + vertex_size_range = list("Group" = c(1.5 * nice_size, 1.5 * nice_size), "elements" = c(0.5 * nice_size, 0.5 * nice_size)), + vertex.shape = "circle", + legend = FALSE, edge.curved = 0.3, + edge.color = unique(V(go)$color) + ) + do.call(c_net_plot, append(list(go = go), pcutils::update_param(default_arg, list(...)))) + } else if (get_n(go)$n_type == "twocol") { + nice_size <- ceiling(60 / sqrt(length(V(go)))) + 1 + default_arg <- list( + labels_num = 0, + vertex.shape = "circle", + edge_legend = FALSE, + edge.color = "black" + ) + do.call(c_net_plot, append(list(go = go), pcutils::update_param(default_arg, list(...)))) + } else if (get_n(go)$n_type == "ko_net") { + nice_size <- ceiling(60 / sqrt(length(V(go)))) + 1 + default_arg <- list( + labels_num = "all", + vertex.shape = "circle", + vertex_size_range = list("Pathway" = c(1.2 * nice_size, 1.2 * nice_size), "KOs" = c(0.6 * nice_size, 0.6 * nice_size)), + edge_legend = FALSE, + edge.color = "black", + mark_alpha = 0.1 + ) + do.call(c_net_plot, append(list(go = go), pcutils::update_param(default_arg, list(...)))) + } else { + c_net_plot(go, ...) + } +} + +get_net_main <- function(n_index) { + main <- "Network" + if (!is.null(n_index$n_type)) { + switch(n_index$n_type, + "single" = { + main <- "Correlation network" + }, + "bipartite" = { + main <- "Bipartite network" + }, + "multi_full" = { + main <- "Multi-omics network" + }, + "module" = { + main <- paste0(n_index$n_modules, "-modules network") + }, + "skeleton" = { + main <- paste0(n_index$skeleton, " skeleton network") + }, + "venn" = { + main <- "Venn network" + }, + default = { + main <- "Network" + } + ) + } + return(main) +} + +scale_size_width <- function(tmp_v, tmp_e, vertex_size_range, edge_width_range) { + { v_groups <- unique(tmp_v$v_group) + nice_size <- ceiling(100 / sqrt(nrow(tmp_v))) + 1 + + vertex_size_range_default <- rep(list(c(max(nice_size * 0.4, 3), min(nice_size * 1.6, 12))), length(v_groups)) + names(vertex_size_range_default) <- v_groups + + if (!is.null(vertex_size_range)) { + if (!is.list(vertex_size_range)) vertex_size_range <- list(vertex_size_range) + if (is.null(names(vertex_size_range))) { + vertex_size_range <- rep(vertex_size_range, length(v_groups)) + names(vertex_size_range) <- v_groups + } + vertex_size_range <- pcutils::update_param(vertex_size_range_default, vertex_size_range) + } else { + vertex_size_range <- vertex_size_range_default + } + + node_size_text <- setNames(as.list(numeric(length(v_groups))), v_groups) + for (i in v_groups) { + node_size_text[[i]] <- c( + min(tmp_v[tmp_v$v_group == i, "size"], na.rm = TRUE), + max(tmp_v[tmp_v$v_group == i, "size"], na.rm = TRUE) + ) + tmp_v[tmp_v$v_group == i, "size"] <- do.call(pcutils::mmscale, append( + list(tmp_v[tmp_v$v_group == i, "size"]), + as.list(sort(vertex_size_range[[i]][1:2])) + )) + } } + + { + edge_width_range_default <- vertex_size_range_default[[1]] / 6 + if (is.null(edge_width_range)) edge_width_range <- edge_width_range_default + edge_width_range <- sort(edge_width_range) + edge_width_text <- c(min(tmp_e$width, na.rm = TRUE), max(tmp_e$width, na.rm = TRUE)) + tmp_e$width <- pcutils::mmscale(tmp_e$width, edge_width_range[1], edge_width_range[2]) + } + + envir <- parent.frame() + assign("node_size_text", node_size_text, envir) + assign("edge_width_text", edge_width_text, envir) + assign("tmp_e", tmp_e, envir) + assign("tmp_v", tmp_v, envir) +} + +some_custom_paras <- function(tmp_v, tmp_e, ...) { + params <- list(...) + params_name <- names(params) + + # 下列都是mapping好的颜色,形状等,无法单独修改某一个vertex或edge的颜色,形状等 + # !!!考虑增加额外参数,用于单独修改某一个vertex或edge的颜色,形状等 + if (!"label.color" %in% colnames(tmp_v)) tmp_v$label.color <- "black" + if ("vertex.size" %in% params_name) tmp_v$size <- params[["vertex.size"]] + if ("vertex.color" %in% params_name) { + tmp_v$color <- condance(data.frame( + tmp_v$color, + pcutils::tidai(tmp_v$v_class, params[["vertex.color"]], fac = TRUE) + )) + } + if ("vertex.shape" %in% params_name) { + tmp_v$shape <- condance(data.frame( + tmp_v$shape, + pcutils::tidai(tmp_v$v_group, params[["vertex.shape"]]) + )) + } + if ("vertex.label" %in% params_name) tmp_v$label <- params[["vertex.label"]] + if ("vertex.label.color" %in% params_name) { + tmp_v$label.color <- condance(data.frame( + "black", + pcutils::tidai(tmp_v$v_group, params[["vertex.label.color"]], fac = TRUE) + )) + } + + if ("edge.color" %in% params_name) { + tmp_e$color <- condance(data.frame( + tmp_e$color, + pcutils::tidai(tmp_e$e_type, params[["edge.color"]], fac = TRUE) + )) + } + if ("edge.lty" %in% params_name) { + tmp_e$lty <- condance(data.frame( + tmp_e$lty, + pcutils::tidai(tmp_e$e_class, params[["edge.lty"]], fac = TRUE) + )) + } + if ("edge.width" %in% params_name) tmp_e$width <- params[["edge.width"]] + + envir <- parent.frame() + assign("tmp_e", tmp_e, envir) + assign("tmp_v", tmp_v, envir) +} + +pie_set_for_plot <- function(tmp_v, pie_value, pie_color) { + if ("pie" %in% tmp_v$shape) { + if (!is.null(pie_value)) { + if (!is.data.frame(pie_value)) stop("pie_value must be a data.frame.") + if (!"name" %in% colnames(pie_value)) { + pie_value$name <- rownames(pie_value) + } + if (any(duplicated(pie_value$name))) { + stop( + "Duplicated name in annotation tables: ", + paste0(pie_value$name[duplicated(pie_value$name)], collapse = ", ") + ) + } + tmp_merge_df <- left_join(tmp_v["name"], pie_value, by = "name") + pie_value <- tmp_merge_df[, -1] + pie_parts <- colnames(pie_value) + + pie_value[is.na(pie_value)] <- 0 + pie_value$`__others` <- ifelse(rowSums(pie_value) > 0, 0, 1) + pie_value_list <- as.list(pcutils::t2(pie_value)) + + default_pie_color <- setNames(pcutils::get_cols(length(pie_parts), "col1"), pie_parts) + if (is.null(pie_color)) pie_color <- default_pie_color + if (is.null(names(pie_color))) { + pie_color <- setNames(pie_color, pie_parts) + } else { + pie_color <- pcutils::update_param(default_pie_color, pie_color) + } + + pie_color <- pie_color[pie_parts] + pie_color <- c(pie_color, `__others` = NA) + } else { + pie_value_list <- pie_color <- NULL + } + } else { + pie_value_list <- pie_color <- NULL + } + envir <- parent.frame() + assign("pie_value_list", pie_value_list, envir) + assign("pie_color", pie_color, envir) +} + +get_show_labels <- function(tmp_v, labels_num) { + name <- size <- NULL + if (is.null(labels_num)) { + if (nrow(tmp_v) < 20) { + labels_num <- "all" + } else { + labels_num <- 0 + } + } + { + if (labels_num == "all") { + tmp_v %>% dplyr::pull(name) -> toplabel + } else { + if (labels_num >= 1) { + tmp_v %>% + dplyr::top_n(labels_num, size) %>% + dplyr::arrange(-size) %>% + dplyr::pull(name) %>% + head(labels_num) -> toplabel + } else { + tmp_v %>% + dplyr::top_frac(labels_num, size) %>% + dplyr::arrange(-size) %>% + dplyr::pull(name) %>% + head(ceiling(labels_num * nrow(tmp_v))) -> toplabel + } + } + tmp_v$label <- ifelse(tmp_v$name %in% toplabel, tmp_v$label, NA) + } + return(tmp_v) +} + +module_set_for_plot <- function(tmp_v, mark_module, mark_color) { + if (mark_module) { + new_modu <- as_module(setNames(tmp_v$module, tmp_v$name)) + new_modu[["others"]] <- NULL + + module_color <- pcutils::get_cols(length(new_modu)) + if (!is.null(mark_color)) module_color <- condance(data.frame(module_color, pcutils::tidai(names(new_modu), mark_color))) + + module_color <- setNames(module_color, names(new_modu)) + module_color <- module_color[names(module_color) != "others"] + } else { + new_modu <- module_color <- NULL + } + envir <- parent.frame() + assign("new_modu", new_modu, envir) + assign("module_color", module_color, envir) +} + +get_module_coors <- function(go = NULL, coors = NULL, tmp_v = NULL, ori_coors = NULL, module_label_just = c(0.5, 0.5), rescale_flag = TRUE) { + X <- Y <- module <- minx <- maxx <- miny <- maxy <- NULL + if (is.null(go)) { + if (is.null(tmp_v) && is.null(ori_coors)) message("input `tmp_v` and `ori_coors` when `go` is null.") + } else { + tmp_v <- get_v(go) + ori_coors <- get_coors(coors, go) + } + module_coors <- dplyr::left_join(tmp_v[, c("name", "module")], ori_coors, by = "name") + if (rescale_flag) module_coors <- dplyr::mutate(module_coors, X = mmscale(X, -1, 1), Y = mmscale(Y, -1, 1)) + module_coors <- dplyr::group_by(module_coors, module) %>% + dplyr::summarise(minx = min(X), maxx = max(X), miny = min(Y), maxy = max(Y)) + module_label_just <- rep(module_label_just, 2) + module_coors <- mutate(module_coors, + X = minx + module_label_just[1] * (maxx - minx), + Y = miny + module_label_just[2] * (maxy - miny) + ) + return(module_coors) +} + +produce_c_net_legends <- function(tmp_v, tmp_e, vertex_frame_width, + legend_position, legend_number, legend_cex, + node_size_text, edge_width_text, + group_legend_title, group_legend_order, + color_legend, color_legend_order, + size_legend, size_legend_title, + edge_legend, edge_legend_title, edge_legend_order, + width_legend, width_legend_title, + lty_legend, lty_legend_title, lty_legend_order, + module_legend, module_legend_title, module_legend_order, module_color, mark_alpha, + pie_legend, pie_legend_title, pie_legend_order, pie_color, + ...) { + color <- e_type <- lty <- e_class <- v_class <- shape <- left_leg_x <- right_leg_x <- NULL + + legend_position_default <- c(left_leg_x = -2, left_leg_y = 1, right_leg_x = 1.2, right_leg_y = 1) + + if (is.null(legend_position)) legend_position <- legend_position_default + if (is.null(names(legend_position))) { + legend_position <- setNames(legend_position, names(legend_position_default)[seq_along(legend_position)]) + } + legend_position <- pcutils::update_param(legend_position_default, legend_position) + here_env <- environment() + lapply(names(legend_position), \(i){ + assign(i, legend_position[i], here_env) + }) + + vgroups <- pcutils::change_fac_lev(tmp_v$v_group, group_legend_order) + vgroups <- levels(vgroups) + + if (color_legend) { + # !!!考虑添加更多的形状,至少是21:25,形状为pie时添加额外legend + + if (is.null(group_legend_title)) { + group_legend_title <- setNames(vgroups, vgroups) + } else if (is.null(names(group_legend_title))) { + group_legend_title <- setNames(rep(group_legend_title, len = length(vgroups)), vgroups) + } + + this_shape <- unique(tmp_v$shape) + if (!all(this_shape %in% names(default_v_shape))) { + default_v_shape <- pcutils::update_param( + default_v_shape, + setNames(rep(21, length(this_shape)), this_shape) + ) + } + + for (g_i in vgroups) { + if ("count" %in% names(tmp_v)) { + tmp_v1 <- tmp_v[tmp_v$v_group == g_i, c("v_class", "color", "shape", "count")] + } else { + tmp_v1 <- tmp_v[tmp_v$v_group == g_i, c("v_class", "color", "shape")] + } + + tmp_v1$v_class <- factor(tmp_v1$v_class, levels = custom_sort(unique(tmp_v1$v_class))) + + vclass <- pcutils::change_fac_lev(tmp_v1$v_class, color_legend_order) + vclass <- levels(vclass) + + node_cols <- dplyr::distinct(tmp_v1, color, v_class) + node_cols <- setNames(node_cols$color, node_cols$v_class) + node_shapes <- dplyr::distinct(tmp_v1, shape, v_class) + node_shapes <- setNames(node_shapes$shape, node_shapes$v_class) + + if (legend_number) { + eee <- table(tmp_v1$v_class) + if (!is.null(attributes(tmp_v)$skeleton)) { + eee <- setNames(tmp_v1$count, tmp_v1$v_class) + legend_number <- FALSE + } + le_text <- paste(vclass, eee[vclass], sep = ": ") + } else { + le_text <- vclass + } + if (length(le_text) == 0) le_text <- "" + legend(left_leg_x, left_leg_y, + cex = 0.7 * legend_cex, adj = 0, pt.lwd = vertex_frame_width, + legend = le_text, title.cex = 0.8 * legend_cex, + title = group_legend_title[g_i], title.font = 2, title.adj = 0, + col = "black", pt.bg = node_cols[vclass], bty = "n", pch = default_v_shape[node_shapes[vclass]] + ) + + left_leg_y <- left_leg_y - (length(vclass) * 0.12 + 0.2) * legend_cex + } + } + + if (module_legend) { + tmp_v$module <- factor(tmp_v$module, levels = custom_sort(unique(tmp_v$module))) + modules <- pcutils::change_fac_lev(tmp_v$module, module_legend_order) + modules <- levels(modules) + + if (legend_number) { + eee <- table(tmp_v$module) + le_text <- paste(modules, eee[modules], sep = ": ") + } else { + le_text <- modules + } + legend(left_leg_x, left_leg_y, + cex = 0.7 * legend_cex, adj = 0, + legend = le_text, title.cex = 0.8 * legend_cex, + title = module_legend_title, title.font = 2, title.adj = 0, + fill = pcutils::add_alpha(module_color[modules], mark_alpha), + border = module_color[modules], bty = "n" + ) + + left_leg_y <- left_leg_y - (length(modules) * 0.12 + 0.2) * legend_cex + } + + if (pie_legend) { + pie_color <- pie_color[names(pie_color) != "__others"] + pies <- pcutils::change_fac_lev(names(pie_color), pie_legend_order) + pies <- levels(pies) + + le_text <- pies + legend(left_leg_x, left_leg_y, + cex = 0.7 * legend_cex, adj = 0, + legend = le_text, title.cex = 0.8 * legend_cex, + title = pie_legend_title, title.font = 2, title.adj = 0, + fill = pie_color[pies], + border = "black", bty = "n" + ) + left_leg_y <- left_leg_y - (length(pies) * 0.12 + 0.2) * legend_cex + } + + if (size_legend) { + legend( + x = right_leg_x, y = right_leg_y, + cex = 0.7 * legend_cex, title.font = 2, title = size_legend_title, title.adj = 0, + legend = c( + paste(lapply(node_size_text[vgroups], \(i)round(i[1], 3)), collapse = "/ "), + paste(lapply(node_size_text[vgroups], \(i)round(i[2], 3)), collapse = "/ ") + ), + adj = 0, title.cex = 0.8 * legend_cex, + col = "black", bty = "n", pch = 21, pt.cex = c(min(tmp_v$size), max(tmp_v$size)) * legend_cex / 5 + ) + right_leg_y <- right_leg_y - 0.5 * legend_cex + } + + if (edge_legend) { + tmp_e$e_type <- factor(tmp_e$e_type, levels = custom_sort(unique(tmp_e$e_type))) + edges <- pcutils::change_fac_lev(tmp_e$e_type, edge_legend_order) + edges <- levels(edges) + edge_cols <- dplyr::distinct(tmp_e, color, e_type) + edge_cols <- setNames(edge_cols$color, edge_cols$e_type) + if (legend_number) { + eee <- table(tmp_e$e_type) + le_text <- paste(edges, eee[edges], sep = ": ") + } else { + le_text <- edges + } + legend(right_leg_x, right_leg_y, + cex = 0.7 * legend_cex, title.font = 2, title = edge_legend_title, title.adj = 0, + legend = le_text, adj = 0, title.cex = 0.8 * legend_cex, + col = edge_cols[edges], bty = "n", lty = 1 + ) + right_leg_y <- right_leg_y - (length(unique(tmp_e$color)) * 0.12 + 0.2) * legend_cex + } + + if (width_legend) { + legend(right_leg_x, right_leg_y, + cex = 0.7 * legend_cex, title.font = 2, title = width_legend_title, title.adj = 0, + legend = edge_width_text %>% round(., 3), adj = 0, title.cex = 0.8 * legend_cex, + col = "black", bty = "n", lty = 1, lwd = c(min(tmp_e$width), max(tmp_e$width)) + ) + right_leg_y <- right_leg_y - 0.5 * legend_cex + } + + if (lty_legend) { + edges <- pcutils::change_fac_lev(tmp_e$e_class, lty_legend_order) + edges <- levels(edges) + edge_ltys <- dplyr::distinct(tmp_e, lty, e_class) + edge_ltys <- setNames(edge_ltys$lty, edge_ltys$e_class) + + if (legend_number) { + eee <- table(tmp_e$e_class) + le_text <- paste(edges, eee[edges], sep = ": ") + } else { + le_text <- edges + } + legend(right_leg_x, right_leg_y, + cex = 0.7 * legend_cex, title.font = 2, title = lty_legend_title, title.adj = 0, + legend = le_text, adj = 0, title.cex = 0.8 * legend_cex, + col = "black", bty = "n", lty = edge_ltys[edges] + ) + } +} + +#' Plot a metanet +#' +#' @param go an igraph or metanet object +#' @param coors the coordinates you saved +#' @param ... additional parameters for \code{\link[igraph]{igraph.plotting}} +#' @param labels_num show how many labels, >1 indicates number, <1 indicates fraction, "all" indicates all. +#' @param vertex_size_range the vertex size range, e.g. c(1,10) +#' @param edge_width_range the edge width range, e.g. c(1,10) +#' +#' @param plot_module logical, plot module? +#' @param mark_module logical, mark the modules? +#' @param mark_color mark color +#' @param mark_alpha mark fill alpha, default 0.3 +#' @param module_label show module label? +#' @param module_label_cex module label cex +#' @param module_label_color module label color +#' @param module_label_just module label just, default c(0.5,0.5) +#' +#' @param pie_value a dataframe using to plot pie (with rowname or a "name" column) +#' @param pie_color color vector +#' +#' @param legend all legends +#' @param legend_number legend with numbers +#' @param legend_cex character expansion factor relative to current par("cex"), default: 1 +#' @param legend_position legend_position, default: c(left_leg_x=-1.9,left_leg_y=1,right_leg_x=1.2,right_leg_y=1) +#' +#' @param group_legend_title group_legend_title, length must same to the numbers of v_group +#' @param group_legend_order group_legend_order vector +#' @param color_legend logical +#' @param color_legend_order color_legend_order vector +#' @param size_legend logical +#' @param size_legend_title size_legend_title +#' +#' @param edge_legend logical +#' @param edge_legend_title edge_legend_title +#' @param edge_legend_order edge_legend_order vector, e.g. c("positive","negative") +#' @param width_legend logical +#' @param width_legend_title width_legend_title +#' +#' @param lty_legend logical +#' @param lty_legend_title lty_legend_title +#' @param lty_legend_order lty_legend_order +#' +#' @param module_legend logical +#' @param module_legend_title module_legend_title +#' @param module_legend_order module_legend_order +#' +#' @param pie_legend logical +#' @param pie_legend_title pie_legend_title +#' @param pie_legend_order pie_legend_order +#' +#' @param seed random seed, default:1234, make sure each plot is the same. +#' @param params_list a list of parameters, e.g. list(edge_legend = TRUE, lty_legend = FALSE), when the parameter is duplicated, the format argument will be used rather than the argument in params_list. +#' @param rescale Logical constant, whether to rescale the coordinates to the (-1,1). +#' +#' @family plot +#' @return a network plot +#' @export +#' +#' @examples +#' data("c_net") +#' c_net_plot(co_net) +#' c_net_plot(co_net2) +#' c_net_plot(multi1) +c_net_plot <- function(go, coors = NULL, ..., labels_num = NULL, + vertex_size_range = NULL, edge_width_range = NULL, + plot_module = FALSE, + mark_module = FALSE, mark_color = NULL, mark_alpha = 0.3, + module_label = FALSE, module_label_cex = 2, module_label_color = "black", + module_label_just = c(0.5, 0.5), + pie_value = NULL, pie_color = NULL, + legend = TRUE, legend_number = FALSE, legend_cex = 1, + legend_position = c(left_leg_x = -2, left_leg_y = 1, right_leg_x = 1.2, right_leg_y = 1), + group_legend_title = NULL, group_legend_order = NULL, + color_legend = TRUE, color_legend_order = NULL, + size_legend = FALSE, size_legend_title = "Node Size", + edge_legend = TRUE, edge_legend_title = "Edge type", edge_legend_order = NULL, + width_legend = FALSE, width_legend_title = "Edge width", + lty_legend = FALSE, lty_legend_title = "Edge class", lty_legend_order = NULL, + module_legend = FALSE, module_legend_title = "Module", module_legend_order = NULL, + pie_legend = FALSE, pie_legend_title = "Pie part", pie_legend_order = NULL, + params_list = NULL, rescale = FALSE, + seed = 1234) { + if (!is.null(params_list)) { + as.list(match.call()[-1]) -> set_params_list + set_params_list[["params_list"]] <- NULL + for (i in seq_along(params_list)) { + if (names(params_list)[i] %in% names(set_params_list)) { + message("The parameter `", names(params_list)[i], "` is duplicated, the format argument will be used.") + } + } + pcutils::update_param(params_list, set_params_list) -> set_params_list + do.call(c_net_plot, set_params_list) + return(invisible()) + } + + if (length(V(go)) == 0) { + message("The network is empty.") + return(invisible()) + } + new_modu <- module_color <- node_size_text <- edge_width_text <- NULL + set.seed(seed) + + if (!is_metanet(go)) go <- c_net_update(go) + # go <- c_net_update(go) + + # modules + if (plot_module) { + go <- to_module_net(go) + if (is.null(group_legend_title)) group_legend_title <- "Module" + } + + # get network type + get_net_main(get_n(go)) -> main + get_v(go) -> tmp_v + get_e(go) -> tmp_e + + # get coordinates + ori_coors <- get_coors(coors, go, seed = seed) + coors <- ori_coors[, c("X", "Y")] %>% as.matrix() + if (is.null(attributes(ori_coors)$curved)) { + edge_curved <- NULL + } else { + edge_curved <- attributes(ori_coors)$curved$curved + } + + # scale the size and width + scale_size_width(tmp_v, tmp_e, vertex_size_range, edge_width_range) + + # some custom parameters + some_custom_paras(tmp_v, tmp_e, ...) + + # set pie + pie_set_for_plot(tmp_v, pie_value, pie_color) + if (is.null(pie_value) || !"pie" %in% tmp_v$shape) pie_legend <- FALSE + if (is.null(pie_color)) { + pie_color_list <- NULL + } else { + pie_color_list <- list(pie_color) + } + + # show labels + tmp_v <- get_show_labels(tmp_v, labels_num) + + # modules set + module_set_for_plot(tmp_v, mark_module, mark_color) + if (!mark_module) module_legend <- FALSE + + if (any(igraph::is.loop(go))) go <- clean_multi_edge_metanet(go) + # main plot + { + old_xpd <- graphics::par(mar = c(4, 2, 2, 2), xpd = TRUE) + on.exit(graphics::par(old_xpd), add = TRUE) + + igraph::plot.igraph(go, + layout = coors, + vertex.size = tmp_v$size, + vertex.color = tmp_v$color, + vertex.shape = tmp_v$shape, + vertex.label.color = tmp_v$label.color, + edge.color = tmp_e$color, + edge.lty = tmp_e$lty, + edge.width = tmp_e$width, + mark.groups = new_modu, + mark.col = pcutils::add_alpha(module_color[names(new_modu)], mark_alpha), + mark.border = module_color[names(new_modu)], + vertex.pie = pie_value_list, + vertex.pie.color = pie_color_list, + ..., + vertex.frame.width = 0.5, + main = main, + rescale = rescale, + vertex.label.font = 1, + vertex.label.cex = 0.07 * tmp_v$size, + vertex.label = tmp_v$label, + edge.arrow.size = 0.3 * tmp_e$width * 3, + edge.arrow.width = 0.6 * tmp_e$width * 3, + edge.curved = edge_curved, + margin = c(0, 0, 0, 0) + ) + } + + # add module_label + if (module_label) { + rescale_flag <- TRUE + params <- list(...) + if ("rescale" %in% names(params)) { + if (!params[["rescale"]]) rescale_flag <- FALSE + } + module_coors <- get_module_coors( + tmp_v = tmp_v, ori_coors = ori_coors, + module_label_just = module_label_just, rescale_flag = rescale_flag + ) + + n_module <- nrow(module_coors) + module_label_cex <- rep(module_label_cex, n_module) + module_label_color <- rep(module_label_color, n_module) + for (i in seq_len(n_module)) { + text( + x = module_coors[i, "X"], y = module_coors[i, "Y"], + labels = module_coors[i, "module"], + cex = module_label_cex, col = module_label_color[i] + ) + } + } + + if (!legend) { + return(invisible()) + } + + if ("vertex.frame.width" %in% names(list(...))) { + vertex_frame_width <- list(...)[["vertex.frame.width"]] + } else { + vertex_frame_width <- 0.5 + } + # produce legends + if (grepl("skeleton", main)) attributes(tmp_v)$skeleton <- TRUE + produce_c_net_legends( + tmp_v, tmp_e, vertex_frame_width, + legend_position, legend_number, legend_cex, + node_size_text, edge_width_text, + group_legend_title, group_legend_order, + color_legend, color_legend_order, + size_legend, size_legend_title, + edge_legend, edge_legend_title, edge_legend_order, + width_legend, width_legend_title, + lty_legend, lty_legend_title, lty_legend_order, + module_legend, module_legend_title, module_legend_order, module_color, mark_alpha, + pie_legend, pie_legend_title, pie_legend_order, pie_color, ... + ) +}