1
#' @title Plot rank intervals
2
#' @description Compute rank intervals (minimal and maximal possible rank) and visualize them with ggplot. 
3
#' @param P A partial ranking as matrix object calculated with [neighborhood_inclusion]
4
#'    or [positional_dominance].
5
#' @param cent.df A data frame containing centrality scores of indices (optional). See Details.
6
#' @param ties.method String specifying how ties are treated in the base \code{\link[base]{rank}} function.
7
#' @details 
8
#' If a data frame of centrality scores is added, the respective ranks of nodes are
9
#' shown in the intervals. Note that some points might fall outside of the 
10
#' intervals depending how ties are treated.
11
#' 
12
#' @return a ggplot object.
13
#' @author David Schoch
14
#' @seealso [rank_intervals]
15
#' @examples
16
#' library(igraph)
17
#' library(ggplot2)
18
#' g <- graph.empty(n=11,directed = FALSE)
19
#' g <- add_edges(g,c(1,11,2,4,3,5,3,11,4,8,5,9,5,11,6,7,6,8,
20
#'                    6,10,6,11,7,9,7,10,7,11,8,9,8,10,9,10))
21
#' P <- neighborhood_inclusion(g)
22
#' \dontrun{plot_rank_intervals(P)}
23
#' 
24
#' #adding index based rankings
25
#' cent_scores <- data.frame(
26
#'   degree = degree(g),
27
#'   betweenness = round(betweenness(g),4),
28
#'   closeness = round(closeness(g),4),
29
#'   eigenvector = round(eigen_centrality(g)$vector,4))
30
#' \dontrun{plot_rank_intervals(P,cent.df=cent_scores)}
31
#' @export
32

33
plot_rank_intervals <- function(P, cent.df,ties.method="min") {
34 0
    if (!requireNamespace("ggplot2", quietly = TRUE)) {
35 0
        stop("ggplot2 needed for this function to work. Please install it.", call. = FALSE)
36
    }
37
    
38 0
    n <- nrow(P)
39 0
    if (is.null(rownames(P))) {
40 0
        names <- paste0("V",1:nrow(P))
41
    } else {
42 0
      names <- rownames(P)
43
    }
44 0
    intervals <- netrankr::rank_intervals(P)
45 0
    intervals$node <- as.character(names)
46 0
    df <- data.frame(interval = rep(c("max_rank", "min_rank", "mid_point"), each = n), 
47 0
                     node = rep(names, 3), 
48 0
                     rank = c(intervals$max_rank, intervals$min_rank, intervals$mid_point),
49 0
                     order = rep(rank(intervals$mid_point, ties.method = "first"), 3), 
50 0
                     mid_point = rep(intervals$mid_point, 3))
51 0
    if (missing(cent.df)) {
52 0
        ggplot2::ggplot(df, ggplot2::aes_(x = ~stats::reorder(node, order), y = ~rank, group = ~node)) +
53 0
        ggplot2::geom_line(col = "#8F8F8F") + 
54 0
        ggplot2::geom_point(col = "#8F8F8F", 
55 0
                            shape = ifelse(df$interval == "min_rank", 24, 
56 0
                                             ifelse(df$interval == "max_rank", 25, 3)), fill = "#8F8F8F") + 
57 0
        ggplot2::scale_y_continuous(breaks = pretty(1:nrow(P))) + 
58 0
        ggplot2::theme_bw() + 
59 0
        ggplot2::theme(text = ggplot2::element_text(family = "Times", size = 14), 
60 0
                       axis.text.x = ggplot2::element_text(angle = ifelse(any(nchar(names) > 2), 45, 0), hjust = 1), 
61 0
                       legend.position = "bottom", 
62 0
                       panel.border = ggplot2::element_blank(), 
63 0
                       panel.grid = ggplot2::element_blank(), 
64 0
                       axis.ticks = ggplot2::element_blank()) + 
65 0
        ggplot2::labs(x = "", y = "Rank", shape = "", colour = "")
66
    } else {
67 0
        no.indices <- ncol(cent.df)
68 0
        cent.df.long <- data.frame(node = rep(names, no.indices), 
69 0
                                   mid_point = rep(intervals$mid_point, no.indices), 
70 0
                                   index = rep(names(cent.df), each = n), 
71 0
                                   rank = c(apply(cent.df, 2, function(x) rank(x, ties.method = ties.method))))
72 0
        ggplot2::ggplot(df, ggplot2::aes_(x = ~stats::reorder(node, mid_point), 
73 0
                                          y = ~rank, group = ~node)) + 
74 0
          ggplot2::geom_line(col = "#8F8F8F") + 
75 0
          ggplot2::geom_point(col = "#8F8F8F", 
76 0
                              shape = ifelse(df$interval == "min_rank", 24, 
77 0
                                             ifelse(df$interval == "max_rank", 25, 3)), fill = "#8F8F8F") + 
78 0
          ggplot2::geom_jitter(data = cent.df.long, 
79 0
                               ggplot2::aes_(x = ~stats::reorder(node, mid_point), 
80 0
                                             y = ~rank, shape = ~index), size = 2, 
81 0
                                             width = 0.1, height = 0) + 
82 0
          ggplot2::scale_shape_manual(values = 3:(3 + no.indices)) + 
83 0
          ggplot2::scale_y_continuous(breaks = pretty(1:nrow(P))) + 
84 0
          ggplot2::theme_bw() + 
85 0
          ggplot2::theme(text = ggplot2::element_text(family = "Times", size = 14), 
86 0
                         axis.text.x = ggplot2::element_text(angle = ifelse(any(nchar(names) > 2), 45, 0), hjust = 1), 
87 0
                         legend.position = "bottom", 
88 0
                         panel.border = ggplot2::element_blank(), 
89 0
                         panel.grid = ggplot2::element_blank(), 
90 0
                         axis.ticks = ggplot2::element_blank()) + 
91 0
          ggplot2::labs(x = "", y = "Rank", shape = "", colour = "")
92
    }
93
}

Read our documentation on viewing source code .

Loading