--- a +++ b/R/DIscBIO-generic-PlotmclustMB.R @@ -0,0 +1,238 @@ +#' @title Plotting the Model-based clusters in PCA. +#' @description Plot the model-based clustering results +#' @param object \code{DISCBIO} class object. +#' @importFrom ggplot2 ggplot aes geom_point aes_string scale_colour_manual +#' geom_text geom_segment guides guide_legend xlab ylab theme element_blank +#' element_line unit element_text element_rect +#' @importFrom igraph get.edgelist degree get.shortest.paths +#' @return A plot of the PCA. +setGeneric("PlotmclustMB", function(object) { + standardGeneric("PlotmclustMB") +}) + +#' @export +#' @rdname PlotmclustMB +setMethod( + "PlotmclustMB", + signature = "DISCBIO", + definition = function(object) { + if (length(object@MBclusters) == 0) { + stop("run ExprmclustMB before PlotmclustMB") + } + total <- object@MBclusters + + Plotmclust <- function(mclustobj, x = 1, y = 2, MSTorder = NULL, + show_tree = TRUE, show_full_tree = FALSE, + show_cell_names = FALSE, cell_name_size = 3, + markerexpr = NULL, + showcluster = TRUE) { + lib_info_with_pseudo <- data.frame( + State = mclustobj$clusterid, + sample_name = names(mclustobj$clusterid) + ) + lib_info_with_pseudo$State <- + factor(lib_info_with_pseudo$State) + S_matrix <- mclustobj$pcareduceres + pca_space_df <- data.frame(S_matrix[, c(x, y)]) + colnames(pca_space_df) <- c("pca_dim_1", "pca_dim_2") + pca_space_df$sample_name <- row.names(pca_space_df) + edge_df <- merge( + pca_space_df, lib_info_with_pseudo, + by.x = "sample_name", by.y = "sample_name" + ) + edge_df$Marker <- markerexpr[edge_df$sample_name] + if (!is.null(markerexpr)) { + g <- ggplot( + data = edge_df, + aes( + x = pca_space_df$pca_dim_1, + y = pca_space_df$pca_dim_2, + size = edge_df$Marker + ) + ) + if (showcluster) { + g <- g + geom_point( + aes_string(color = lib_info_with_pseudo$State), + na.rm = TRUE + ) + g <- g + scale_colour_manual( + values = c( + "1" = "black", + "2" = "blue", + "3" = "green", + "4" = "red", + "5" = "yellow", + "6" = "gray" + ) + ) + } else { + g <- g + geom_point(na.rm = TRUE, color = "green") + } + } else { + g <- + ggplot( + data = edge_df, + aes( + x = pca_space_df$pca_dim_1, + y = pca_space_df$pca_dim_2 + ) + ) + if (showcluster) { + g <- g + geom_point( + aes_string(color = lib_info_with_pseudo$State), + na.rm = TRUE, size = 3 + ) + g <- g + scale_colour_manual( + values = c( + "1" = "black", + "2" = "blue", + "3" = "green", + "4" = "red", + "5" = "yellow", + "6" = "gray" + ) + ) + } else { + g <- g + geom_point(na.rm = TRUE, size = 3) + } + } + if (show_cell_names) { + g <- g + geom_text( + aes(label = names(mclustobj$clusterid)), + size = cell_name_size + ) + } + + if (show_tree) { + clucenter <- mclustobj$clucenter[, c(x, y)] + clulines <- NULL + if (show_full_tree) { + alledges <- + as.data.frame(get.edgelist(mclustobj$MSTtree), + stringsAsFactors = FALSE + ) + alledges[, 1] <- as.numeric(alledges[, 1]) + alledges[, 2] <- as.numeric(alledges[, 2]) + for (i in seq_len(nrow(alledges))) { + clulines <- rbind( + clulines, + c( + clucenter[alledges[i, 1], ], + clucenter[alledges[i, 2], ] + ) + ) + } + } else { + if (is.null(MSTorder)) { + clutable <- table(mclustobj$clusterid) + alldeg <- degree(mclustobj$MSTtree) + allcomb <- expand.grid( + as.numeric(names(alldeg)[alldeg == 1]), + as.numeric(names(alldeg)[alldeg == 1]) + ) + allcomb <- + allcomb[allcomb[, 1] < allcomb[, 2], ] + numres <- t(apply(allcomb, 1, function(i) { + tmp <- as.vector( + get.shortest.paths( + mclustobj$MSTtree, + i[1], i[2] + )$vpath[[1]] + ) + c(length(tmp), sum(clutable[tmp])) + })) + orderedRows <- order( + numres[, 1], numres[, 2], + decreasing = TRUE + )[1] + optcomb <- allcomb[orderedRows, ] + MSTorder <- get.shortest.paths( + mclustobj$MSTtree, optcomb[1], + optcomb[2] + )$vpath[[1]] + } + for (i in 1:(length(MSTorder) - 1)) { + clulines <- rbind( + clulines, + c( + clucenter[MSTorder[i], ], + clucenter[MSTorder[i + 1], ] + ) + ) + } + } + clulines <- data.frame( + x = clulines[, 1], + xend = clulines[, 3], + y = clulines[, 2], + yend = clulines[, 4] + ) + g <- g + geom_segment( + aes_string( + x = "x", + xend = "xend", + y = "y", + yend = "yend", + size = NULL + ), + data = clulines, + size = 1, + color = "orange" + ) + clucenter <- data.frame( + x = clucenter[, 1], + y = clucenter[, 2], + id = seq_len(nrow(clucenter)) + ) + g <- g + geom_text( + aes_string( + label = "id", + x = "x", + y = "y", + size = NULL + ), + data = clucenter, + size = 10, + color = "orange" + ) + } + g <- + g + + guides( + colour = guide_legend(override.aes = list(size = 5)) + ) + + xlab(paste0("PCA_dimension_", x)) + + ylab(paste0("PCA_dimension_", y)) + + theme( + panel.border = element_blank(), + axis.line = element_line() + ) + + theme( + panel.grid.minor.x = element_blank(), + panel.grid.minor.y = element_blank() + ) + + theme( + panel.grid.major.x = element_blank(), + panel.grid.major.y = element_blank() + ) + + theme( + legend.position = "top", + legend.key.size = unit(0.3, "in"), + legend.text = element_text(size = 20), + legend.title = element_text(size = 20), + legend.box = "vertical" + ) + + theme(legend.key = element_blank()) + + theme(panel.background = element_rect(fill = "white")) + + theme( + axis.text.x = element_text(size = 17, color = "black"), + axis.text.y = element_text(size = 17, color = "black"), + axis.title.x = element_text(size = 20, vjust = -1), + axis.title.y = element_text(size = 20, vjust = 1), + plot.margin = unit(c(1, 1, 1, 1), "cm") + ) + g + } + Plotmclust(total) + } +)