Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/pushrelease.yml
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ jobs:

- uses: r-lib/actions/setup-r@v2

- uses: r-lib/actions/setup-pandoc@v1
- uses: r-lib/actions/setup-pandoc@v2

- uses: r-lib/actions/setup-r-dependencies@v2
with:
Expand Down
4 changes: 2 additions & 2 deletions DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Package: manynet
Title: Many Ways to Make, Modify, Map, Mark, and Measure Myriad Networks
Version: 1.4.1
Date: 2025-04-09
Version: 1.5.0
Date: 2025-06-22
Description: Many tools for making, modifying, mapping, marking, measuring,
and motifs and memberships of many different types of networks.
All functions operate with matrices, edge lists, and 'igraph', 'network', and 'tidygraph' objects,
Expand Down
25 changes: 2 additions & 23 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -140,18 +140,7 @@ S3method(net_dims,igraph)
S3method(net_dims,matrix)
S3method(net_dims,network)
S3method(pillar_shaft,logi)
S3method(plot,diff_model)
S3method(plot,diffs_model)
S3method(plot,learn_model)
S3method(plot,matrix)
S3method(plot,network_measures)
S3method(plot,network_motif)
S3method(plot,node_measure)
S3method(plot,node_member)
S3method(plot,node_motif)
S3method(plot,tie_measure)
S3method(print,diff_model)
S3method(print,diffs_model)
S3method(print,learn_model)
S3method(print,mnet)
S3method(print,network_measure)
Expand All @@ -165,7 +154,6 @@ S3method(print,tie_measure)
S3method(select_nodes,igraph)
S3method(select_nodes,tbl_graph)
S3method(summary,diff_model)
S3method(summary,diffs_model)
S3method(summary,learn_model)
S3method(summary,network_measure)
S3method(summary,network_motif)
Expand Down Expand Up @@ -242,6 +230,7 @@ S3method(to_no_isolates,list)
S3method(to_no_isolates,matrix)
S3method(to_no_isolates,network)
S3method(to_no_isolates,tbl_graph)
S3method(to_no_missing,tbl_graph)
S3method(to_onemode,igraph)
S3method(to_onemode,matrix)
S3method(to_onemode,tbl_graph)
Expand Down Expand Up @@ -792,6 +781,7 @@ export(to_mode2)
export(to_multilevel)
export(to_named)
export(to_no_isolates)
export(to_no_missing)
export(to_onemode)
export(to_permuted)
export(to_reciprocated)
Expand Down Expand Up @@ -844,15 +834,9 @@ importFrom(dplyr,tibble)
importFrom(dplyr,ungroup)
importFrom(ggplot2,aes)
importFrom(ggplot2,arrow)
importFrom(ggplot2,element_blank)
importFrom(ggplot2,element_text)
importFrom(ggplot2,geom_histogram)
importFrom(ggplot2,geom_hline)
importFrom(ggplot2,geom_point)
importFrom(ggplot2,geom_segment)
importFrom(ggplot2,geom_text)
importFrom(ggplot2,geom_tile)
importFrom(ggplot2,geom_vline)
importFrom(ggplot2,ggplot)
importFrom(ggplot2,ggsave)
importFrom(ggplot2,ggtitle)
Expand All @@ -861,12 +845,7 @@ importFrom(ggplot2,labs)
importFrom(ggplot2,scale_alpha_manual)
importFrom(ggplot2,scale_color_brewer)
importFrom(ggplot2,scale_fill_brewer)
importFrom(ggplot2,scale_fill_gradient)
importFrom(ggplot2,scale_size)
importFrom(ggplot2,scale_x_discrete)
importFrom(ggplot2,scale_y_discrete)
importFrom(ggplot2,theme)
importFrom(ggplot2,theme_grey)
importFrom(ggplot2,theme_void)
importFrom(ggplot2,unit)
importFrom(ggplot2,xlab)
Expand Down
31 changes: 31 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,34 @@
# manynet 1.5.0

## Package

- Updated pandoc setup in pushrelease workflow

## Making

- Dropped print and summary methods for diffs_model (moved to `{migraph}`)

## Modifying

- Added `to_no_missing()` for removing nodes with missing data
- Fixed `as_diffusion.mnet()` so that it includes "diff_model" class

## Measuring

- Dropped plotting methods (moved to `{autograph}`)
- Added Page 2010 citation to `node_richness()` documentation

## Memberships

- Fixed `node_in_leiden()` to use resolution parameter in call to igraph

## Data

- Improved `table_data()` so that it lists components, longitudinal, dynamic,
and changing data
- Added more description for `fict_lotr`
- Added `irps_revere` data

# manynet 1.4.1

## Making
Expand Down
77 changes: 0 additions & 77 deletions R/class_measures.R
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,6 @@ make_network_measure <- function(out, .data, call) {
out
}

make_network_measures <- function(out, .data) {
time <- value <- NULL
out <- dplyr::as_tibble(out) %>%
dplyr::mutate(time = as.numeric(names(out))) %>%
dplyr::select(time, value)
class(out) <- c("network_measures", class(out))
attr(out, "mode") <- net_dims(.data)
out
}

# Printing ####
#' @importFrom cli spark_bar
#' @export
Expand Down Expand Up @@ -135,70 +125,3 @@ summary.network_measure <- function(object, ...,
", p = ", cli::style_italic(round(p,3)),
")")
}

# Plotting ####
#' @export
plot.node_measure <- function(x, type = c("h", "d"), ...) {
#type <- match.arg(type)
density <- NULL
if (is.null(attr(x, "mode"))) attr(x, "mode") <- rep(FALSE, length(x))
data <- data.frame(Score = x, Mode = attr(x, "mode"))
if (length(type) == 2) {
p <- ggplot2::ggplot(data = data, ggplot2::aes(x = .data$Score)) +
ggplot2::geom_histogram(ggplot2::aes(y = ggplot2::after_stat(density)),
binwidth = ifelse(max(data$Score) > 1, 1,
ifelse(max(data$Score) >
.1, .1, .01))) +
ggplot2::geom_density(col = 2) +
ggplot2::scale_y_continuous("Frequency", sec.axis =
ggplot2::sec_axis(~ ., breaks = c(0,1),
name = "Density"))
} else if (length(type) == 1 & type == "h") {
p <- ggplot2::ggplot(data = data, ggplot2::aes(x = .data$Score)) +
ggplot2::geom_histogram(ggplot2::aes(y = ggplot2::after_stat(density)),
binwidth = ifelse(max(data$Score) > 1, 1,
ifelse(max(data$Score) >
.1, .1, .01))) +
ggplot2::labs(x = "Density", y = "Frequency")
} else if (length(type) == 1 & type == "d") {
p <- ggplot2::ggplot(data = data, ggplot2::aes(x = .data$Score)) +
ggplot2::geom_density(col = 2) +
ggplot2::ylab("Density")
}
p +
ggplot2::theme_classic() +
ggplot2::theme(panel.grid.major = ggplot2::element_line(colour = "grey90"))
}

#' @export
plot.tie_measure <- function(x, type = c("h", "d"), ...) {
type <- match.arg(type)
data <- data.frame(Score = x)
if (type == "h") {
p <- ggplot2::ggplot(data = data) +
ggplot2::geom_histogram(ggplot2::aes(x = .data$Score),
binwidth = ifelse(max(data$Score) > 1, 1,
ifelse(max(data$Score) > .1,
.1,
.01))) +
ggplot2::ylab("Frequency")
} else {
p <- ggplot2::ggplot(data = data) +
ggplot2::geom_density(ggplot2::aes(x = .data$Score)) +
ggplot2::ylab("Density")
}
p + ggplot2::theme_classic() +
ggplot2::theme(panel.grid.major = ggplot2::element_line(colour = "grey90"))
}

#' @export
plot.network_measures <- function(x, ...) {
ggplot2::ggplot(data = x, ggplot2::aes(x = .data$time, y = .data$value)) +
ggplot2::geom_line() +
ggplot2::theme_minimal() +
ggplot2::xlab("Time") +
ggplot2::ylab("Value")
}

# defining global variables more centrally
utils::globalVariables(c(".data"))
140 changes: 0 additions & 140 deletions R/class_members.R
Original file line number Diff line number Diff line change
Expand Up @@ -58,144 +58,4 @@ summary.node_member <- function(object, ...,
}
}

#' @importFrom stats cutree
#' @export
plot.node_member <- function(x, ...) {
thisRequires("ggdendro")
hc <- attr(x, "hc")
k <- attr(x, "k")
memb <- x[hc$order]
clust <- memb[!duplicated(memb)]
colors <- ifelse(match(memb, clust) %% 2,
"#000000", "#E20020")
ggdendro::ggdendrogram(hc, rotate = TRUE) +
ggplot2::geom_hline(yintercept = hc$height[length(hc$order) - k],
linetype = 2,
color = "#E20020") +
ggplot2::theme(axis.text.x = ggplot2::element_text(colour = "#5c666f"),
axis.text.y = suppressWarnings(
ggplot2::element_text(colour = colors)))
}

# plot(as_matrix(ison_adolescents),
# membership = node_regular_equivalence(ison_adolescents, "e"))
# plot(as_matrix(ison_southern_women),
# membership = node_regular_equivalence(ison_southern_women, "e"))
#' @importFrom ggplot2 ggplot geom_tile aes scale_fill_gradient theme_grey labs theme scale_x_discrete scale_y_discrete geom_vline geom_hline element_blank element_text
#' @export
plot.matrix <- function(x, ..., membership = NULL) {

thisRequires("tidyr")
if (!is_twomode(x)) {
blocked_data <- as_matrix(x)
if (!is.null(membership)) blocked_data <- blocked_data[order(membership),
order(membership)]
} else if (is_twomode(x) &&
length(intersect(membership[!node_is_mode(x)],
membership[!node_is_mode(x)])) > 0) {
blocked_data <- as_matrix(to_multilevel(x))
if (!is.null(membership)) blocked_data <- blocked_data[order(membership),
order(membership)]
} else {
blocked_data <- manynet::as_matrix(x)
}

from <- to <- weight <- NULL

plot_data <- as_edgelist(blocked_data)
if(!is_labelled(x)){
indices <- c(plot_data$from,plot_data$to)
plot_data$from <- paste0("N", gsub("\\s", "0",
format(plot_data$from,
width=max(nchar(indices)))))
plot_data$to <- paste0("N", gsub("\\s", "0",
format(plot_data$to,
width=max(nchar(indices)))))
}
all_nodes <- expand.grid(node_names(blocked_data),
node_names(blocked_data))
all_nodes <- data.frame(from = all_nodes$Var1, to = all_nodes$Var2,
weight = 0)
plot_data <- rbind(plot_data, all_nodes) %>% dplyr::distinct(from, to, .keep_all = TRUE)
g <- ggplot2::ggplot(plot_data, ggplot2::aes(to, from)) +
ggplot2::theme_grey(base_size = 9) +
ggplot2::labs(x = "", y = "") +
ggplot2::theme(
legend.position = "none",
axis.ticks = ggplot2::element_blank(),
axis.text.y = ggplot2::element_text(
size = 9 * 0.8,
colour = "grey50"
),
axis.text.x = ggplot2::element_text(
size = 9 * 0.8,
angle = 30, hjust = 0,
colour = "grey50"
)
) +
# ggplot2::geom_tile(ggplot2::aes(fill = .data[["value"]]),
ggplot2::geom_tile(ggplot2::aes(fill = weight),
colour = "white"
)

# Color for signed networks
if (is_signed(x)) {
g <- g +
ggplot2::scale_fill_gradient2(high = "#003049",
mid = "white",
low = "#d62828")
} else {
g <- g +
ggplot2::scale_fill_gradient(
low = "white",
high = "black"
)
}

# Structure for multimodal networks
if (!is_twomode(x)) {
g <- g +
ggplot2::scale_x_discrete(expand = c(0, 0), position = "top",
limits = colnames(blocked_data)
) +
ggplot2::scale_y_discrete(expand = c(0, 0),
limits = rev(rownames(blocked_data))
)
if (!is.null(membership))
if(!is.numeric(membership)) membership <- as.numeric(as.factor(membership))
g <- g + ggplot2::geom_vline(
xintercept = c(1 + which(diff(membership[order(membership)]) != 0))
- .5,
colour = "red"
) +
ggplot2::geom_hline(
yintercept = nrow(blocked_data) -
c(1 + which(diff(membership[order(membership)]) != 0)) +
1.5,
colour = "red"
)
} else {
g <- g +
ggplot2::scale_y_discrete(expand = c(0, 0),
limits = rev(rownames(x[["blocked.data"]])[x[["order.vector"]][["nodes1"]]])
) +
ggplot2::scale_x_discrete(expand = c(0, 0), position = "top",
limits = colnames(x[["blocked.data"]])[x[["order.vector"]][["nodes2"]]]
) +
ggplot2::geom_vline(
xintercept =
c(1 + which(diff(x[["block.membership"]][["nodes2"]]) != 0))
- .5,
colour = "blue"
) +
ggplot2::geom_hline(
yintercept = nrow(x[["blocked.data"]])
- c(1 + which(diff(x[["block.membership"]][["nodes1"]]) != 0))
+ 1.5,
colour = "red"
)
}
g
}

elementwise.all.equal <- Vectorize(function(x, y) {isTRUE(all.equal(x, y))})
Loading
Loading