splot.netobject now routes on the Nestimate
$method slot rather than just direction. Undirected
sequence-based networks from build_cna() and
wtna(method = "cooccurrence") get oval TNA-family styling
(layout, palette, donuts) with arrows and dotted edge starts
automatically dropped because the matrix is symmetric. Glasso / cor /
pcor / ising networks still get psych_styling = TRUE
(spring layout, Okabe-Ito palette).from_tna() auto-detects integer-valued weight matrices
(ftna, ctna, raw counts) and sets
weight_digits = edge_label_digits = 0 so edge labels render
as 2304 rather than 2304.00. Fractional
weights still format to two decimals. Explicit user-supplied
weight_digits still wins.psych_styling = TRUE is now exported as a first-class
styling preset (undirected counterpart of tna_styling) —
Okabe-Ito palette, spring layout, no arrows — applied by default to
splot.netobject on correlation-family input and to the
$contemporaneous / $between constituents of
net_mlvar.splot() dispatch coverage across the tna and
Nestimate class hierarchies, ensuring tna,
ftna, ctna, group_tna,
tna_bootstrap, group_tna_bootstrap,
tna_permutation, group_tna_permutation,
netobject, netobject_group,
netobject_ml, net_mlvar,
wtna_mixed, net_bootstrap,
net_permutation, boot_glasso,
mcml, net_hon, net_hypa, and
simplicial_complex all reach the correct renderer.detect_duplicate_edges(),
aggregate_duplicate_edges(),
simplify.cograph_network(), and the internal
check_duplicate_edges() helper now respect directed vs
undirected semantics. Previously the canonical (min/max) endpoint key
collapsed A -> B and B -> A into one
edge even on directed graphs, matching igraph::simplify()
ground truth..compute_modularity() replaces a nested for loop with
cluster-wise vectorization
(sum(A[idx, idx]) - sum(k_out[idx]) * sum(k_in[idx]) / m),
per the project “no for loops” rule. Results verified bit-exact against
igraph::modularity().is_directed() now recognises
CographNetwork R6 objects — previously only the
cograph_network list format dispatched correctly.compute_layout_for_cograph() uses
layout$get_type() instead of the removed $name
field on CographLayout.network_small_world() returns 0 (valid: no
triangles means definitively not small-world) instead of
NA_real_ when the observed clustering coefficient is zero
but path length is finite.simplify.cograph_network() threads the directed flag
through to edge aggregation so directed multigraphs collapse
correctly.simplify() performance refactor for large networks plus
a cleaner title-composition path.motifs(), extract_motifs(), and
plot.cograph_motif_analysis examples reworked to use
n_perm = 10L (or significance = FALSE) and
promoted from \dontrun to CRAN-runnable (optional tna
branches stay in \donttest). Retires 320 seconds of latent
CRAN timing risk — every example now runs in under 4 seconds.test-audit-fixes.R — ground-truth regressions for the
directed edge semantics, modularity vectorization, and small-world
behaviour changes.test-integer-weight-labels.R — locks
from_tna() integer-weight auto-detect behaviour and
precedence of explicit weight_digits.test-equiv-{assortativity, cluster-quality, communities, disparity, edge-centrality, network-summary, robustness, standalone-measures}.R
— numerical equivalence against igraph, sna, centiserve, brainGraph,
influenceR, tidygraph, and NetworkX. Gated by
skip_coverage_tests() + skip_on_cran(), so they do not run
on the CRAN pipeline.These measures don’t fit the per-node centrality() data
frame, so they live as standalone functions:
estrada_index() — graph-level spectral invariant: ,
equal to the trace of the matrix exponential of the adjacency.
Equivalently, the sum of subgraph_centrality() across all
nodes. Matches networkx.estrada_index at machine epsilon
(max relative diff ~5e-15 across random test graphs).trophic_incoherence() — graph-level food-web stability
measure (Johnson et al. 2014). Defined as the population standard
deviation of per-edge trophic differences where is the trophic level of
node . Zero for perfectly coherent DAGs (e.g., a pure chain). Matches
networkx.trophic_incoherence_parameter at machine epsilon.
Directed-only; reuses the existing trophic_level
calculator.group_centrality(x, nodes, measure = c("betweenness", "closeness", "degree"))
— Everett-Borgatti (1999) group centrality for a set of nodes.
Returns a scalar. Supports mode = "in"/"out" for
directed-degree variants. Group closeness and group
degree match networkx.group_*_centrality
bit-exact. Group betweenness implements the textbook
Everett-Borgatti / Puzis 2008 definition (fraction of shortest paths
passing through at least one node in the group), which diverges from
networkx.group_betweenness_centrality on some graphs due to
a known quirk in NetworkX’s Puzis-Yahalom-Elovici iterative algorithm.
Verified via an independent Python brute-force: cograph matches the
textbook definition; NX produces larger values on graphs with many
overlapping shortest paths. Documented in the roxygen “Divergence from
NetworkX” section.dispersion(x, u = NULL, v = NULL, normalized = TRUE, alpha = 1, b = 0, c = 0)
— Backstrom-Kleinberg (2014 Facebook) pair-level measure of tie
strength. Counts the number of “well-dispersed” mutual friends of
u and v (pairs of common neighbors that are
not directly connected and share no common neighbor inside
u’s ego network other than u and
v). Matches networkx.dispersion bit-exact
across all 156 edges on the karate club graph. Returns a scalar, named
vector, or data frame depending on which of u,
v are specified.Added the five Gould-Fernandez (1989) brokerage role counts, a
foundational measure in social network analysis (~1500 citations). Each
role is a separate per-node measure requiring a membership
argument (following the same pattern as participation,
within_module_z, gateway), and counts open
directed 2-paths a -> v -> c through broker
v:
centrality_brokerage_coordinator() — all three in
broker’s group (w_I)centrality_brokerage_itinerant() — endpoints same
group, broker different (w_O, “consultant”)centrality_brokerage_representative() — broker + source
same, target different (b_IO)centrality_brokerage_gatekeeper() — broker + target
same, source different (b_OI)centrality_brokerage_liaison() — all three in different
groups (b_O)Bit-exact match against sna::brokerage$raw.nli for all
five roles across 20 random directed graphs. Implemented natively (no
runtime dependency on sna). Key implementation detail: the
Gould-Fernandez counting rule requires open 2-paths
only — triads where a direct edge a -> c
already exists are excluded. This matches sna’s C implementation exactly
and was derived empirically (sna’s .C("brokerage_R", ...)
has no R-level source).
Directed-only; warns and returns NA on undirected
input.
centrality_prestige_domain() — directed-graph prestige
measure: for each node , the number of other nodes that can reach via a
directed path. Classical Wasserman-Faust (1994) measure from
sna::prestige(cmode = "domain"). Bit-exact match against
sna, implemented natively via
igraph::distances(mode = "out") +
colSums(is.finite(D)) - 1 (no runtime dependency on sna).
Directed-only; returns NA with a warning on undirected input.centrality_prestige_domain_proximity() —
distance-weighted variant: R_v^2 / (D_v * (n - 1)) where
R_v is the number of reachers and D_v is the
sum of their geodesic distances to v. Bit-exact match
against sna::prestige(cmode = "domain.proximity") on
strongly connected directed graphs. On graphs with any unreachable pair,
sna has a known bug (FALSE * Inf = NaN collapses the
denominator, producing all-zero output); cograph’s
is.finite()-masked formula produces mathematically correct
values on any directed graph. Directed-only.centrality_katz() — Katz (1953) status index. Bit-exact
match against centiserve::katzcent (cograph mirrors
centiserve’s exact LAPACK call sequence). Also matches
igraph::alpha_centrality(exo = 1) and
networkx.katz_centrality_numpy at machine epsilon. New
katz_alpha parameter (default 0.1).centrality_hubbell() — Hubbell (1965) input-output
centrality. Bit-exact match against centiserve::hubbell
(cograph mirrors centiserve’s full-inverse LAPACK call path). Note:
centiserve’s default (weights = NULL) silently ignores
E(g)$weight; to reproduce cograph’s behavior with
centiserve on weighted graphs, pass
weights = igraph::E(g)$weight explicitly. New
hubbell_weight parameter (default 0.5).centrality_information() — Stephenson-Zelen (1989)
information centrality. Bit-exact match against
sna::infocent on connected undirected graphs (cograph
mirrors sna’s exact construction and solve() call
sequence).centrality_pairwisedis() — Pairwise disconnectivity
(Potapov et al. 2008). Directed-only; fraction of reachable ordered
pairs that become unreachable when each node is removed. Bit-exact match
against centiserve::pairwisedis. Warns and returns
NA on undirected input, matching the convention used by
salsa, leaderrank, and
trophic_level.centrality_reaching_local() /
reaching_global() — Local and global reaching centrality
(Mones, Vicsek & Vicsek 2012). Bit-exact match against
networkx.local_reaching_centrality across the directed
unweighted, undirected unweighted, and weighted branches. Undirected
unweighted LRC coincides with
igraph::harmonic_centrality(normalized = TRUE)
(documented). reaching_global() is a graph-level hierarchy
statistic in [0, 1].plot_simplicial() now accepts tna,
netobject, net_hon, and net_hypa
objects directly — higher-order pathways are auto-built and visualized
with proper state labels, no manual extraction needed. New parameters:
method ("hon" / "hypa"),
max_pathways, ncol. Dismantled mode uses
gridExtra grid layout with scaled nodesprint.cograph_network() now shows a structured summary:
node/edge counts, density, reciprocity, weight range, and top-degree
nodes — replacing the minimal R6 default outputmcml S3 class with as_mcml() generic
for type-safe handling of Markov Chain Multi-Level models — enables
print(), plot(), and method dispatch on MCML
objects%||% operator for R 4.1 compatibility (no
longer requires R 4.4+)$between →
$macro, $within → $clustersas_tna() on MCML objects now returns a flat
group_tna list instead of a nested structureplot_mcml() now suppresses zero-weight edges instead of
drawing invisible lines, and strips leading zeros from edge labels
(.32 instead of 0.32)cluster_summary() are now preserved in
the macro diagonal, reflecting intra-cluster retention ratesoverlay_communities() for drawing community blob
overlays on any network plot — accepts method names, membership vectors,
or pre-computed community objectsplot_simplicial() for higher-order pathway
visualization, rendering simplicial complexes as smooth blobs with
flexible separators and a dismantled view optionvalue_nudge parameter to
plot_transitions() for controlling the distance between
flow labels and nodesbundle_legend_size,
bundle_legend_color, bundle_legend_fontface,
bundle_legend_positionlabel_size,
label_color, label_fontface,
label_hjust) to plot_transitions(),
plot_trajectories(), and plot_alluvial()cluster_summary() for aggregating network weights
at the cluster level, producing between-cluster and within-cluster
matrices from raw transition databuild_mcml() for constructing Markov Chain
Multi-Level models from edge lists or sequence data with automatic
cluster detectioncluster_quality() for modularity-based cluster
quality metrics and cluster_significance() for
permutation-based significance testingas_tna() to convert cluster summaries to TNA
objects for bootstrapping, permutation testing, and plotting with
splot()simplify() for pruning weak edges from networks,
with configurable weight threshold and aggregation methoddisparity_filter() for backbone extraction
(Serrano et al. 2009), with methods for matrices, tna, igraph, and
cograph_network objectsrobustness() for network robustness analysis with
targeted (betweenness, degree) and random attack strategies, plus
ggplot_robustness() for faceted ggplot2 outputtemporal_edge_list() for converting sequence data
to timestamped edge listssupra_adjacency(), supra_layer(),
supra_interlayer() for multilayer supra-adjacency matrix
constructionlayer_similarity(),
layer_similarity_matrix(), and
layer_degree_correlation() for comparing layers in
multilayer networksaggregate_weights() and
aggregate_layers() for weight aggregation across
layersverify_with_igraph() for cross-validating cograph
centrality and network metrics against igraphmotifs() / subgraphs() as a unified
API for triad census (node-exchangeable counts) and instance extraction
(named node triples), with auto-detection of actor/session columns,
rolling/tumbling window support, and exact configuration model
significance testingplot_mcml() for Markov Chain Multi-Level
visualization showing between-cluster summary edges alongside
within-cluster detail, with pie charts, self-loops, and 22 customization
parametersplot_chord() for native chord diagrams with
automatic weight-based arc sizingplot_time_line() for cluster membership timeline
visualizationplot_htna() orientations: "facing"
(tip-to-tip columns) and "circular" (two semicircles), plus
intra_curvature for drawing intra-group edges as dotted
bezier arcsthreshold parameter to all plot functions for
filtering edges/cells below a minimum absolute weightvalue_fontface, value_fontfamily,
and value_halo parameters to plot_heatmap()
for text styling controlscale_nodes_by:
indegree, outdegree, instrength,
outstrength, incloseness,
outcloseness, inharmonic,
outharmonic, ineccentricity,
outeccentricityscale_nodes_scale parameter to
splot() for dampening (< 1) or exaggerating (> 1)
centrality-based node sizing differencessplot(): when
plotting tna objects, qgraph-style parameters (vsize,
asize, edge.color, lty,
shape) are automatically mapped to cograph equivalentsnode_label_format (e.g.,
"{state} (n={count})") for showing counts on transition
plot nodesbundle_size for aggregating
individual trajectories into weighted summary lines in large
datasetsshow_values /
value_position for displaying transition counts on flow
lineslabel_position consistency across ALL columns
(first, middle, last) in trajectory plotsgamer_data,
group_engagement, srl_dataset_node_groups() /
get_node_groups() for managing cluster assignments on
cograph_network objects$meta with
getter/setter functionsgroup_tna support to splot() for
direct plotting of grouped TNA modelscentrality_* wrapper its own focused help
pagesplot() viewport
calculationsplot()’s signature and
silently dropped when dispatchingplot_heatmap() so
high values get dark colorsbuild_mcml() density method crash when weight
vector had no names.collect_dispatch_args() helper to replace 6 copy-paste
dispatch blocks, using match.call() + mget()
for reliable argument capturecentrality() with 23 measures and individual
wrappers: degree, strength, betweenness, closeness, eigenvector,
pagerank, harmonic, authority, hub, alpha, power, kreach, diffusion,
percolation, eccentricity, transitivity, constraint, coreness, load,
subgraph, leverage, laplacian, current-flow betweenness, current-flow
closeness, voterankedge_betweenness() for edge-level centralitydetect_communities() with 11 algorithms: louvain,
walktrap, fast_greedy, label_propagation, leading_eigenvector, infomap,
spinglass, leiden, optimal, edge_betweenness, multilevel — plus
com_* shorthand aliasescluster_significance()
for permutation-based validationnetwork_summary() and
summarize_network() for computing comprehensive
network-level statistics (density, reciprocity, transitivity, diameter,
components, degree distribution)plot_transitions() for alluvial/Sankey flow
diagrams, with plot_alluvial() and
plot_trajectories() wrappersplot_bootstrap() and
plot_permutation() for significance-styled visualization of
bootstrap and permutation test results — significant edges rendered
solid on top, non-significant edges dashed behindplot_mixed_network() for overlaying symmetric
(undirected, straight) and asymmetric (directed, curved) edges on the
same networkplot_heatmap() for adjacency matrix heatmaps with
optional hierarchical clustering and plot_ml_heatmap() for
multilayer 3D perspective heatmapsplot_compare() for difference network
visualization showing edge-weight changes between two networkssplot() S3 methods for tna_bootstrap
and tna_permutation objectsmotif_census(), triad_census(), and
extract_motifs() for triad motif analysis with pattern
filtering, significance testing, and network diagram visualizationfilter_edges(), subset_edges(),
select_nodes(), select_edges() for flexible
network subsettingset_groups() for storing cluster assignments on
cograph_network objects with automatic dispatch to
plot_htna() / plot_mtna()cograph_network objects
as input, in addition to matrices, igraph objects, and tna objectslayout_spring and layout_gephi_fr
algorithms: vectorized attraction forces, edge aggregation for dense
networkspar(pin) error on exit when plot device state was
corruptedx across all
plotting functions:
plot_tna(): input → xplot_htna(): input → x (was
model)plot_mtna(): input → x (was
model)splot() already used xtplot() default margins causing tiny plots
compared to splot()vignettes/qgraph-to-splot.md)The following parameters have been renamed for consistency. The old names still work but emit deprecation warnings:
| Old Name | New Name | Reason |
|---|---|---|
esize |
edge_size |
Add edge_ prefix, expand abbreviation |
cut |
edge_cutoff |
Add edge_ prefix, clarify meaning |
usePCH |
use_pch |
Fix camelCase to snake_case |
positive_color |
edge_positive_color |
Add edge_ prefix (matches theme storage) |
negative_color |
edge_negative_color |
Add edge_ prefix (matches theme storage) |
donut_border_lty |
donut_line_type |
Expand lty abbreviation |
edge_label_fontface now accepts string values (“plain”,
“bold”, “italic”, “bold.italic”) in addition to numeric valuesmlna() for multilevel network visualization with
3D perspectivemtna() for multi-cluster network visualization
with shape-based cluster containersplot_htna() for hierarchical multi-group network
layouts with polygon and circular arrangementstplot() as a qgraph drop-in replacement with
automatic parameter translationarrow_angle parameter for customizable arrowhead
geometryedge_start_dot_density parameter for TNA-style
dotted edge starts indicating directionfrom_tna() —
no manual matrix extraction needednetwork and
qgraph objects as inputpie_values vector to
donut_fill when all values are in [0,1]splot() when other parameters were specifieddonut_shape validation rejecting custom SVG
shapesfrom_qgraph() when a layout
override was providednormalize_coords()from_qgraph() by using a
matrix intermediary for per-edge vector reorderingnrow(el) crash: qgraph’s Edgelist is a list, not
a data.framedonut_empty parameter for rendering unfilled
donut nodesfrom_qgraph() for converting qgraph objects to
cograph format, reading resolved graphAttributes for
accurate parameter extractionlayout_info guard causing errors on certain
device configurationssoplot() for grid/ggplot2-based network plotting
— full feature parity with splot() using a different
rendering backendlayout_oval() for oval/elliptical node
arrangementslayout_scale parameter to expand or contract the
network layout, with "auto" mode for node-count-based
scalingedge_start_style parameter for visually
indicating edge direction via styled start segments (dashed,
dotted)soplot() curve direction and edge defaults
diverging from splot() behaviorrescale_layout distorting oval aspect ratios by
switching to uniform scalingpar(pin) restoration error on plot device
exitsplot() — a base R graphics engine for network
visualization using polygon(), lines(), and
xspline(), providing better performance than grid-based
rendering for large networkssn_save() with
configurable DPIdonut_color API to accept 1 color (fill), 2 colors (fill +
background), or n colors (per-node)