autograph 1.2.1
CRAN release: 2026-08-26
autograph 1.2.0
Package
- Removed the CRAN version check from
.onAttach(), makinglibrary(autograph)faster to attach- Fixed
.onAttach()not applying the ink of a persisted theme
- Fixed
- Added goldfish to
Enhances - Added systemfonts to
Suggests - Added a
website-buildsjob toprchecks.yml, reporting whether the site builds-
count_pages()was missing from the reference index, which stopped it
-
- Updated CONTRIBUTING with conventions for function names,
NEWS.mdbullets, the website reference index, and keeping tutorials and articles in step - Added
stocnet_completion()to offer values an argument accepts as RStudio completions-
graphr(fict_lotr, node_color =Tab lists the node variablesfict_lotrholds - Covers node and tie variables, layouts, label criteria, themes, and defaults such as
isolates - Off unless asked for, since it replaces/encapsulates one of RStudio’s internal functions;
stocnet_completion(FALSE)restores it - A
persistargument remembers the choice, asstocnet_theme()does - Values labelled with its class and its categories or range; a layout with the package that draws it
-
Layouts
- Improved layered layouts
- Consolidated layered layouts onto one engine
- “layered” is now default layout for directed acyclic networks
- Deprecating “hierarchy” as “layered” is more consistent for two-mode networks
- “lineage” is now exactly “layered” with the axes exchanged
- Deprecating “alluvial” to free name for plot of changing membership composition
- “railway” and “ladder” unchanged, but are
alignment = "rungs" - Checks whether layout is appropriate for the network, and reverts to default if not
- Minimises two costs: tie length (
check_span()) and nodal offset (check_offset()) - Added
ranks=to choose the layers:- “compact” asks
igraph::layout_with_sugiyama() - “generation” ranks each node by its distance from a root
- “tight” (default) minimises total tie length while every tie points down at least one layer
- a numeric node attribute lays the layers out by its values, spaced in proportion to them, which is what “lineage” used to take a
rankfor
- “compact” asks
- Added
alignment=to choose how a layer is spread out:- “straight” (default) draws ties as close to straight as ordering allows
- “rungs” gives every layer same integer spacing
- Each weakly connected component now laid out on its own and packed beside others
- Fixed
layout_layered()centring on a second mode node yet reading first mode labels - Fixed the direction of layers given as values to
ranks= - Fixed layered layout labels to ignore
label_repel
- Consolidated layered layouts onto one engine
- Improved multilevel layout
- Renamed “multilevel” layout to “levels” to avoid potential future collisions
- Fixed
layout_levels()to identify modes without having to name alevel - Exposed
method,alpha,beta,FUN1andFUN2arguments
- Deprecated “dyad”, “triad”, “tetrad”, “pentad” and “hexad” layout names
- “configuration” already picks the one matching the number of nodes
- The
layout_dyad()tolayout_hexad()functions themselves are unchanged
- Fixed three broken paths in
layout_concentric()- Fixed drawing each node of an unlabelled network on a circle of its own
- Fixed erroring where a membership holds
NA, now gathersNAnodes onto own circle - Fixed
order.by=, which errored on every network; now orders nodes around each circle by that attribute, decreasing
- Fixed
graphr(snap = TRUE)to use rotation and other improvements - Added a “scaling” layout for multidimensional scaling
- Scales classically up to a hundred nodes, and by pivots above that
- Scales unweighted path distances, so it can handle signed/weighted networks
- Lays each component out separately, where “pmds” refuses disconnected networks outright
- Drawn with labelled axes at a fixed ratio, since these coordinates can be read
- Captioned with
check_stress()for Kruskal’s stress-1, and console-reported where poor, as well as the share of distance variance two dimensions hold
- Added a “correspondence” layout for correspondence analysis
- Places nodes by the similarity of their tie profiles
- Reads directed networks symmetrically by default, but “out” or “in” possible
- Refuses signed network, but
double=TRUEan option - Console-reports low broomstick ratio dimensions and low cos2 nodes
- Added a
layout_matching()alias so every layout has a short name - Removed unreachable
getNNvec()
Graphing
- Fixed
graphr()clipping nodes at panel edges- Nodes were drawn at absolute sizes, but scales are expanded by a share of data range, so
ggplot2’s 5% left less room than the radius of a node in a small network - Room is now taken from node size, so small networks are given more space
- Nodes were drawn at absolute sizes, but scales are expanded by a share of data range, so
- Added
backbone=tographr()for drawing dense, hairball “stress”, “fr”, “drl”, “kk” networks- By default, networks with 50+ nodes and a mean degree ≥8 use backbones
-
TRUE/FALSEforce, or specify filter/threshold (seemanynet::tie_is_backbone())
- Improved
graphr()to draw multilevel networks of interlocking one-mode and two-mode layers by default- Fixed tie opacity so that those between levels fade behind those within them
- Fixed default node size in multilevel layout, which is now taken from how many nodes there are at each level rather than in the whole network
- Fixed labelling to be plain text nudged away instead of white-boxed labels
- Fixed arcs drawn on layout that places two nodes at one point, e.g.
graphr(ison_networkers, layout = "scaling") - Fixed
graphr()to draw parallel ties as a fan instead of one on top of another - Fixed tie colouring in multiplex networks to color layers not signs by default
- Signs are still drawn as linetypes
- Added a legend for the tie linetype wherever it is the only thing showing the signs, and is titled by whatever color is showing
- Improved node shape legend to name modes where two-mode network records them instead of default “One” and “Two”
- Fixed size of self-loops to draw as a fraction of how far the layout spreads rather than at a fixed diameter of one coordinate unit
- Improved
node_groupto draw overlapping hulls (closes #51)- e.g.
graphr(ison_adolescents, node_group = netrics::node_x_clique())
- e.g.
- Improved
graphr()to note when a colour/shape legend grows past about 7 keys - Fixed
graphs()to collect guides even where panels held different ranges or categories (closes #15)
Theming
- Added
persist=tostocnet_theme()-
persist = TRUEwrites it totools::R_user_dir("autograph", "config") - Nothing written to disk unless passed explicitly
- Setting a theme without it clears any choice persisted earlier
-
- Improved font detection in
stocnet_theme()via systemfonts- Added
list_fonts()for listing the font families R can see
- Added
- Added
stocnet_medium()for standardising output to the expected medium:- “screen” (default), “presentation”, “mobile”, and “print”
-
ag_size()scales text, not node size or anything else - “print” draws on white irrespective of theme grounding
- Improved theme backgrounds to reach every plot, not only the graphs
- Plot themes are now built with the
ag_theme_*()wrappers - Blanked elements stay blank, so a graph keeps no axis text or coordinates
- Ties, nodes, and labels with no colour take
ag_ink()and the ground
- Plot themes are now built with the
- Added
simulate_colorblind(),check_separation()andcheck_contrast()for checking palettes- Simulates deuteranopia, protanopia, and tritanopia (Machado et al. 2009)
- Scores a pair by its worst case across those and normal vision
- Added
severity=to view anomalous trichromacy (deuteranomaly, protanomaly) - Added “grey” type to show a palette as print and photocopy may render it
- Added
check_span()for scoring how far each tie travels down the page - Added
check_offset()for scoring how far each tie is from its ideal straight line - Added
ag_ink()for the colour a theme writes with- Used by axis text and reference lines, clearing 4.5:1 from the ground
- Frees
ag_base()to be light where that sets it off from the highlight
- Added
ag_missing()for the neutral that data recedes into:- missing values, isolates, and any “other” remainder
- Improved
ag_qualitative()to note when a palette is asked for more colours than it holds - Improved every theme’s categorical palette for colour-blind viewers
-
ag_qualitative()uses most distinct, own colors first not mixtures - Samples across the palette only where it holds too few colours
- Kept “rainbow” in its own order, since fidelity to a spectrum is its point
-
- Improved some highlight pairs
- Fixed “neon” highlight pair, a cyan and a green 12.7 apart
- Fixed “ethz” and “cmu” highlight pairs by lightening their greys
- Fixed divergent palettes pairing a red pole with a green or teal one, such as in “ethz”
- Added a “clay” theme inspired by palette and fonts of Anthropic’s Claude
Plotting
- Added
plot.goldfishFit()for the four diagnostic panels a fit can supply- Deviance trace, Schoenfeld smooths, score processes, and waiting times
- Draws only from what the fit stores, leaving a missing panel out
- Draws the waiting-time panel for exact-time models only
- Draws the compact term strings the test itself carries, which do not repeat where an effect appears over two networks
- Reports how many terms the Schoenfeld panel dropped
- Fixed the Schoenfeld panel to select terms by column position
- The labels it matched on intersect the effect names on the intercept alone, so it drew one term where four were asked for
- Added
plot.goldfishGOF()for each effect’s cumulative score process- Draws the Brownian-bridge bands the effect’s p-value was read from
- Draws x on the object’s own process time, named for the clock it records
- Inverts the distribution the event-clock p-value comes from
- Added
plot.goldfishTimeTest()for the scaled Schoenfeld residuals- Draws a smooth per effect, with the fitted estimate as the reference
- Colours the scatter by period under
method = "periods"
- Added
plot.goldfishOnset()for the parameter path and information accrual- Windows both panels on the excursion, so each coefficient gets its scales
- Draws the proportional diagonal, the departure from which is the finding
- Added
view = c("both", "path", "accrual")to select a single panel
- Added
plot.goldfishMargins()for observed against expected activity- Draws martingale residuals where the model class defines a compensator
- Draws the calibration ratio where it does not, from the recorded scales
- Draws the
topactors furthest from the reference, and counts the rest - Draws level against shape where goldfish supplies
dispersion - Names both omissions: under two completed spans, and beyond
top
- Added a
pageargument toplot()on the per-term diagnostics- Applies to
goldfishGOF,goldfishTimeTest, andgoldfishOnset - Added
count_pages(), reporting the count without rendering - Renamed from
ag_pages(), sinceag_is for the theme accessors - Errors with the page count where
pageis past the last - Leaves each figure as it was where
pageis omitted
- Applies to
- Renamed the goldfish classes to a package prefix and a camelCase noun
-
goldfishOutliers,goldfishChangepoints,goldfishOnset,goldfishMargins,goldfishGOF,goldfishTimeTest,goldfishScoreTest, andgoldfishFit - A name such as
test_gofis what a sibling package would pick too, and two packages emitting one class string cannot be told apart by dispatch - Renamed the dispatch methods and the precooked fixtures to match
- Kept the older class names as aliases, so such objects plot as before
- Documented the convention in CONTRIBUTING, for the whole ecosystem
-
- Improved
plot.goldfishOutliers()andplot.goldfishChangepoints()- Renamed from
plot.outliers.goldfish()andplot.changepoints.goldfish() - Read the metadata each object carries rather than inferring it
- Plot the
.seriescolumn, so a diagnostic called witheffect =is drawn as that term’s series rather than as a log-likelihood trace - Fixed both to facet on process, so no line crosses a process boundary
- Fixed
plot.goldfishChangepoints()to draw each process’s own breaks - Fixed
plot.goldfishOutliers()to read the now-logicaloutliercolumn - Rewrote
plot.goldfishChangepoints()for the tibble with acptcolumn- Labels the axis with break times only where they are numbers, so a dated event stream keeps its date scale
- Renamed from
- Added precooked
goldfish_margins,goldfish_gof,goldfish_time, andgoldfish_onset, and refreshed the two older fixtures- Each is stamped with the goldfish version that produced it, 1.9.21
-
goldfish_outlierscomes from a receiver-choice model of the calls - The others come from event models of the
fisheries_treatieslayer
- Replaced
cli::cli_abort()ingf_facet_paged()withsnet_abort() - Replaced em dashes in
R/plot_diagnostics.Rsince only ASCII is portable - Fixed signed branch of
plot.matrix()hard-coding its poles
autograph 1.1.2
CRAN release: 2026-07-31
Package
- Improved the declared dependencies
- Removed knitr from Suggests: it was used solely by the tutorial tests, which now extract the tutorials’
{r}chunks with the same small scanner used in manynet and netrics (verified to yield an identical expression set toknitr::purl()on the autograph tutorial) - Removed tidygraph from Imports: its only functional use was reading the edgelist’s target column in
.infer_end_cap(), which now usesigraph::as_edgelist()(verified to give identical end caps) - Promoted graphlayouts from Suggests to Imports, since it is required for
grapht()’s default “stress” layout (without it, wave-to-wave node transitions silently degraded to a static aggregate layout) and is installed regardless as ggraph imports it; itsrequireNamespace()/thisRequires()guards have been removed - Declared a minimum manynet version (
>= 2.2.1)
- Removed knitr from Suggests: it was used solely by the tutorial tests, which now extract the tutorials’
- Updated the GitHub Actions workflows
- Updated the actions to their latest major versions (
actions/checkout@v7,actions/upload-artifact@v7,actions/download-artifact@v8), replacing some long-outdated@v2pins - Updated the website deploy job’s
r-lib/actions/setup-pandocfrom@v1to@v2, matching every otherr-lib/actionsstep - Added checks that metadata and tutorial vignettes correspond
- Updated the actions to their latest major versions (
- Improved the test suite while reducing what CRAN has to run
- The functional audits now fail rather than skip when
AUTOGRAPH_STRICT_AUDIT=true, which the CI check step now sets, so a broken layout or plot method can no longer pass CI green - Fixed the layout audit’s fixture and argument maps, which paired several layouts with networks they cannot lay out; because
skip()aborts the enclosingtest_that(), the first such mismatch had been silently preventing every later layout from being audited at all (the layout audit goes from 21 to 108 assertions) - Coverage is now measured with
NOT_CRAN=true, without which everyskip_on_cran()test — most of the suite — was skipped while covr ran, badly under-reporting coverage -
releaseandpkgdownno longer run underif: always(), so a failingR CMD checkcan no longer tag a release or deploy the website - Replaced
graphr()’s sweep over every bundled manynet dataset with a representative sample, and dropped theplot.*smoke tests now subsumed by the plot-method audit; CRAN-visible test time falls while CRAN-visible assertions rise - Added an edge-case audit (
test-functional_errors.R), an audit of the user-facinglayout_*aliases, and examples for theag_*palette accessors and configurational layouts, none of which were previously covered - Theme-mutating tests now restore the previous theme with
on.exit(), so global theme state cannot leak between parallel test workers
- The functional audits now fail rather than skip when
- Updated the website and README
- Updated favicons
- Split Graphing from Plotting functions
- Updated README to send visualisation examples to the website
- Fixed README double logoing on pkgdown build, and added alttext
- Updated CONTRIBUTING with the package architecture, conventions, and dev commands
- Updated remaining base R
stop(),warning()andstopifnot()calls to the manynet cli interface
Graphing
- Improved
graphr()’slabelsargument to label a selection of the nodes, where previously the only alternative to labelling every node was labelling none-
labelsnow also accepts a depth of ranks (labels = 5), a measure to rank by (labels = "betweenness", orlabels = c(betweenness = 5)for both), the name of a logical node attribute, or a logical/name/position vector of the nodes to label - Selection is by rank rather than by headcount, so nodes tied at the cut are labelled together, using
netrics::node_is_max(); a two-mode or multilevel network is ranked within each mode or level, so a dense level cannot crowd the others out of the labelling - Networks of more than 30 nodes now label only their most central nodes by default, reporting how many;
labels = TRUEstill labels every node.manynet::fict_marvelwent from 194 overlapping labels to 10 - Labels are drawn from the selected rows rather than by blanking the rest, so no space is reserved (and nothing is repelled away from) labels that are not drawn
-
grapht()resolves the selection once across all waves, so the same nodes stay labelled from frame to frame, andgraphs()resolves it once for all its panels;grapht()’s own default above 30 nodes remains no labels at all - netrics is only suggested, so an automatic selection falls back to a random sample when it is not installed, and a measure asked for by name says what to install
-
- Fixed
graphs()/grapht()erroring (“Can’t combine..1and ..2”) on a longitudinal network whose changing node attributes are stored as non-character vectors (e.g. the logical activeflag and numeric height/mass infict_starwars)- Such networks now split into waves via a guarded
to_waves()that coerces the offending attributes when manynet’s splitter cannot combine them
- Such networks now split into waves via a guarded
- Fixed
graphr(..., snap = TRUE)erroring (“‘-’ only defined for equally-sized data frames”) whenever a node sat exactly on a grid point-
depth_first_recursive_search()compared each node against a distance vector that still included its own zero self-distance, so an exact hit selected that entry and yielded an empty grid point; the self-distance is now dropped before the nearest vacant point is chosen - two-mode networks hit this on their very first node, since their coordinates are exactly 0 or 1
-
- Improved
graphr()to ignoresnap = TRUEfor layered layouts (“hierarchy”, “railway”, “ladder”, “alluvial”, “multilevel”, “lineage”, “layered”)- These layouts encode rank, mode, or generation along an axis, which square-grid snapping would collapse
- Fixed
graphr()erroring with “argument "node_color" is missing, with no default” when passed a list of networks; the call is now forwarded tographs()as written, rather than argument by argument - Improved how
graphr()checks the attribute names given to its aesthetic arguments- A mistyped node or tie attribute name now errors immediately, naming the argument and offering the closest match:
graphr(net, node_color = "welth")reported “Unknown colour name: welth” at draw time, and now reports that “welth” was not found among the node attributes and asks whether “wealth” was meant - The same applies to
node_shape(previously “Shape aesthetic contains invalid value”),node_sizeandedge_size(previously “Aesthetics must be either length 1 or the same as the data (8)”),node_group, andedge_color
- A mistyped node or tie attribute name now errors immediately, naming the argument and offering the closest match:
- Improved the error when the input is not a network, which now names the argument and the class given, rather than reporting a missing method for
as_tidygraph() - Fixed
isolatesbeing validated only when the network happened to contain isolates, so the same typo errored on one network and was ignored on another - Fixed
node_sizevalues between 0 and 1 being silently multiplied by ten;node_size = 0.5now means 0.5, while a vector of proportions is still rescaled to stay visible - Fixed
graphs()producing empty panels by checkingwavesagainst the number of networks available - Added a set of internal argument checks (
R/graph_checks.R) shared bygraphr(),graphs(),grapht(), thelayout_*()functions, andstocnet_theme()- An unrecognised value now errors immediately, naming the argument and offering the closest match, rather than falling through to ggplot2,
{grid}, ormatch.arg()(soisolates = "drop"reportsisolates, rather than “‘arg’ should be one of …”) - A value that differs only in capitalisation is now used as intended, with a note, instead of being rejected:
node_color = "Wealth"finds thewealthattribute - Note that these checks are stricter than before: a mistyped attribute name used to be ignored silently or to fail later, and now stops the call
- An unrecognised value now errors immediately, naming the argument and offering the closest match, rather than falling through to ggplot2,
- Updated group-reduction note in
graphr()and constant-colour note shared bygraphr()andgrapht()so that their wording cannot drift
Plotting
- Improved
plot.node_member()to draw its dendrogram with ggraph- Passes
hclustobject’s own merge heights to the dendrogram layout to reproduce the previous plot’s leaf order, merge heights, cluster label colours, and cutpoint line - Branches now drawn in
ag_base()rather than black, matching the height axis and so respecting the activestocnet_theme() - Removed ggdendro from Imports
- Passes
- Updated a stale doc cross-reference in
plot.node_member(), which pointed atmanynet::node_in_community(); that function moved to netrics in manynet 2.0.0 - Updated terse or dead-end messages to say what to do next, including
plot.node_motif()/plot.network_motif()(“Cannot plot these motifs yet, sorry.”),match_color(),plot.diff_model(), and the concentric and hierarchy layouts (“Duplicated nodes in layers!”) - Updated zero-variance note shared by three GOF plot methods so that their wording cannot drift
Layouts
- Improved the error on an unrecognised
layout, which now names the argument, suggests the nearest layout, and lists autograph’s own layouts, rather than reporting “object ‘layout_tbl_graph_stresss’ not found”- Passing a layout function (e.g.
layout = igraph::layout_with_fr), rather than its name, now says so instead of erroring with “invalid indexing”
- Passing a layout function (e.g.
- Added checks of the
membership/level/rankarguments that the partition layouts require, which name the argument and offer the closest match
Theming
- Improved
stocnet_theme()to error with the nearest match on an unrecognised theme name, instead of warning and silently leaving the previous theme in place; giving more than one theme name is also caught
Tutorials
- Added a colour blindness section to the visualisation tutorial
- Covers
simulate_colorblind(),check_separation(), and how palettes are ordered - Notes that the “rainbow” theme is not a colour-blind safe scheme
- Covers
- Added a note on installing a theme’s fonts to the visualisation tutorial
- Updated the README with the case for colour-blind readable palettes
- Updated visualization tutorial to use colour/color consistently
- Updated the Labels section of the visualisation tutorial to cover selecting which nodes to label, replacing the
mutate(name = ifelse(...))workaround it used to recommend-
fict_lotr, the tutorial’s running example, has 36 nodes, so its graphs now name only its most central characters; the surrounding prose says so and shows how to choose otherwise - Regenerated
vignettes/articles/visualising-networks.Rmdand the pre-rendered tutorial HTML to match
-
autograph 1.1.1
CRAN release: 2026-07-21
Graphing
- Fixed
grapht()example, which took too long to run, by couching it in\donttest{} - Improved
graphs()to accept bare longitudinal or dynamic networks- Splits it into waves or time slices automatically (consistent with
grapht()), instead of erroring with “invalid to use names()<- on an S4 object of class ‘dgCMatrix’”
- Splits it into waves or time slices automatically (consistent with
- Fixed various errors and warnings in
graphr()/graphs()on signed, directed, or changing networks:- Fixed recycling warnings (“longer object length is not a multiple of shorter object length”) in
graphr()on a complex network- arc geom’s
strengthparameter now excludes loop edges, which are drawn separately bygeom_edge_loop0()
- arc geom’s
- Fixed spurious warning (“no non-missing arguments to max; returning -Inf”) in
graphr()on a changing network without any adoption events (e.g.fict_potter)- such networks now rendered as standard changing networks rather than routed through the diffusion node-colour mapping
- Fixed fails at draw time with “invalid hex digit in ‘color’ or ‘lty’” in
graphr()on a signed multiplex network (e.g.fict_marvel)- ties on non-signed layers (which have a missing sign) are now drawn solid/positive rather than passing
NAto grid
- ties on non-signed layers (which have a missing sign) are now drawn solid/positive rather than passing
- Fixed error with “Aesthetics must be either length 1 or the same as the data” in
graphr()/graphs()on signed longitudinal or directed networks (e.g.to_waves(ison_monks))- per-tie sign linetypes are now mapped through
aes()(with an identity scale) so ggraph’s edge geoms expand and subset them consistently with edge colour and width
- per-tie sign linetypes are now mapped through
- Fixed
graphr(..., snap = TRUE)erroring on two-mode networks: their default “hierarchy” layout is now left un-snapped (with an informative message) since collapsing its layered coordinates onto a square grid is not meaningful, while snapping a two-mode network under a force-directed layout continues to work; also hardened the grid-snapping search so a coordinate landing exactly on a grid point is no longer mistaken for a node’s zero self-distance
- Fixed recycling warnings (“longer object length is not a multiple of shorter object length”) in
autograph 1.1.0
Package
- Test coverage raised by introducing functional testing infrastructure (
tests/testthat/helper-functional.Randtest-functional_*.R) for:- the layout family
- the
plot.*S3 method family - the
ag_*palette accessors across all themes -
graphr()’s aesthetic arguments each enumerated automatically and audited against fixture grids
- Removed the unused internal helper
seq_nodes() - Excluded the interactive-only palette helper
ggpizza()from coverage - Added migraph to Suggests (used in tests only)
Graphing
- Improved how
graphr()treats labels- Fixed labels overlapping nodes (closes #13): labels now keep clear of node borders automatically by giving ggrepel each node’s true rendered size, with
label_distadding a further points-based gap (mirroring igraph’svertex.label.dist) andlabel_repel = FALSEselecting a fixed offset instead of repulsion. - This also fixed a pre-existing bug where non-repelled labels rendered with a fully transparent fill under this package’s theme, making them invisible over nodes.
- Fixed labels overlapping nodes (closes #13): labels now keep clear of node borders automatically by giving ggrepel each node’s true rendered size, with
- Improved
grapht()has been rewritten for smoother, more consistent animations of dynamic networks- Node positions now transition seamlessly between waves using the dynamic stress layout from graphlayouts (
layout_as_dynamic()), with a newalphaargument controlling layout stability; other layouts are computed once on the aggregate network and held fixed - Changing node composition is now handled properly: every node that ever appears gets a stable position and fades in and out in place as it enters and exits the network
- New
isolatesargument ("keep"or"fade") controls whether temporarily isolated nodes stay visible or fade out;keep_isolatesis deprecated - Dynamic (time-stamped, event-based) networks such as
irps_nuclearare now split automatically into cumulative time slices viamanynet::to_slices(), so a single dynamic network object passed tographt()works without manual conversion - Interval (spell) networks that record tie
begin/endlifespans, such asirps_wwi, are now split automatically into one snapshot per change point showing the ties active in that spell, sographt(irps_wwi)works directly (previously it errored because such networks are dynamic but carry notimeattribute forto_slices());irps_wwiis now a runnable example in the documentation -
grapht()now uses the dynamic stress layout by default even for two-mode networks (rather than a hierarchy layout, which collapsed many nodes onto a line), suppresses node labels by default for networks with more than 30 nodes to keep frames legible, and fades densely overlapping ties so they read as a density gradient rather than a solid mass - Fixed an error when animating networks whose node names contain non-ASCII characters
- Waves without any ties are no longer silently dropped
- Closer visual parity with
graphr(): directed networks get arrowheads on segments trimmed at the target node, signed networks distinguish positive/negative ties by linetype and colour, mapped aesthetics use the same palettes with factor levels consistent across frames, and legends transition along with the animation - Aesthetic-resolution helpers are now shared between
graphr()andgrapht()(new R/graph_aes.R), so styling cannot drift between static and animated plots - Added a test suite for
grapht()(no gif rendering required) - Now aborts with a clear message when its input cannot be split into waves or slices, instead of failing much later with a cryptic igraph error (closes #40); the underlying cause —
to_waves()silently ignoring a time attribute not named “wave” — will be fixed in manynet 2.2.2, and the tutorial example now uses awaveattribute, which splits correctly with manynet 2.2.1
- Node positions now transition seamlessly between waves using the dynamic stress layout from graphlayouts (
- Added an
edge_bundleargument tographr()for bundling edges in dense networks (closes #19):-
TRUE/"force"uses force-directed bundling, with"path"and"minimal"selecting the other non-hierarchical algorithms - colour/width/linetype mappings are preserved and directed networks keep their arrowheads.
- This wires up ggraph’s non-hierarchical bundling geoms (added in ggraph 2.2.0), which were previously imported but never called, so the ggraph dependency is now
(>= 2.2.0)
-
- Fixed
edge_size = 0not fully suppressing edges on directed networks (closes #50): arrowhead length was hard-coded regardless ofedge_size, leaving a visible arrowhead when the line was hidden. Arrow length now scales with the resolved edge width (capped so heavily-weighted edges don’t get oversized heads) and is omitted entirely when the width is 0 - Fixed two-mode auto-shapes assigning circles to the second mode: the first mode now takes circles and the second squares, as intended
- Fixed
graphr()returning an empty plot for networks consisting only of isolates (e.g. the empty dyad/triad motifs): isolates are now kept whenever removing them would empty the graph - Fixed
graphs()erroring on lists containing tie-less networks (e.g.plot()on motif censuses): panels sharing a layout now keep isolates so every node has a coordinate in every wave - Fixed
graphr()erroring on weight or size attributes carrying measure classes (e.g.tie_measureresults from netrics stored as attributes) - Fixed a vector-recycling warning in
graphs()’ ego-network detection
Tutorials
- Fixed the “Tying up loose ends” exercise in the visualisation tutorial erroring on
tie_closeness()(closes #39): the tutorial now loads netrics and uses its measure functions (tie_by_closeness(),tie_is_triangular()), and every tutorial code chunk is now exercised by the functional tests below - Reworked the “Visualising Networks” tutorial to match the structure and features of the manynet v2.2 tutorials
- Rebranded the tutorial in autograph red, with larger, more readable text and matching ‘Run code’ buttons
- Added a checkbox Aims section, “Catching up”, “Going further”, “Beginner note”, and “In brief” callout boxes, per-page mini-tables of contents, and free play sections with a choose-your-own-data difficulty ladder
- Added hover-over glossary terms throughout and a closing Summary section with a function overview table and glossary
- Added quiz questions with feedback, and hints for the coding exercises
- New coverage of
edge_bundle,label_repel/label_dist, theisolatesargument,snapgrid-snapping, autograph’s own special-purpose layouts, and programmatic export withggsave() - New sections on directed networks (automatic, width-scaled arrowheads and manual control via
edge_size), automatic mode shapes in two-mode networks, and manually adjusting a layout’s coordinate table before passing it back viax/y - Added artist-themed gifs throughout, including as quiz-answer feedback
- Added a static, read-only version of the tutorial as a pkgdown article (“Tutorials” menu on the website), as in manynet
- Added functional testing of all tutorial code chunks (
tests/testthat/test-tutorials_autograph.R), mirroring manynet’s tutorial testing infrastructure
Layouts
- Fixed
layout_tbl_graph_layered()ordering nodes by the names rather than the positions of their neighbours in adjacent layers, which degraded every barycenter sweep to NA and raised warnings - Replaced deprecated
dplyr::case_match()withdplyr::recode_values()
Plotting
- Fixed
plot.matrix()erroring when nomembershipargument was supplied, for both one-mode and two-mode matrices
autograph 1.0.3
CRAN release: 2026-05-01
Plotting
- Fixed the error produced by a namespace reference in a call in
ergm_resby serializing it, moving to extdata, and loading it viaload_ergm_res()
autograph 1.0.1
Plotting
- Fixed the error in some flavours by removing environment references in included objects
- Closed #44 by adding example that uses
ggplot2::scale_colour_discrete()to tweak colour output
autograph 1.0.0
CRAN release: 2026-04-04
Plotting
- Closed #37 by adding EgoAlter sienaGOF plot
- Fixed #36 by using
.to_factor()inplot.ag_gof()to correct numeric ordering of statistics, and dropped cumulative correction inplot.sienaGOF() - Fixed #38 by dropping linetype in favour of colours even for bw theme in
plot.influenceTable() - Fixed option reference from
snet_themetostocnet_themeinplot.selectionTable()andplot.influenceTable() - Applied
ag_font()to migraph model plots for consistent typography - Reorganised plot scripts by purpose: summaries, tests, and analysis
- Fixed #46 by not appending “X” to the names when creating the data frame and moving factor coercion later in the process
Tutorial
- Fixed #41 by updating tutorials to use fill aesthetics (
scale_fill_*()) instead of colour aesthetics (scale_colour_*())
autograph 0.6.0
CRAN release: 2026-03-01
Graphing
-
graphr()now auto-dispatches tographs()when passed a list of graphs -
graphs()no longer requires patchwork to be loaded separately - Closed #12 by changing node aesthetics from
colortofillusing fillable shape codes (21–25) for nodes to support fill-based colour scales - Consolidated legend modifications into internal
graph_legends()helper - Improved legend labelling:
- edge sign legend now labelled “Sign”
- edge weight/width now labelled “Weight”/“Width”
- node mode/shape legend now labelled “Mode”/“Shape”
- Closed #8 by adding “isolates” argument to
graphr():-
"legend"(default) removes isolates from the graph but notes them in the legend -
"caption"removes isolates from the graph but notes them in the caption -
"keep"retains isolates in the graph as-is (closes #12)
-
Theming
- Removed
scale_*()functions as redundant with better theme support andmatch_color()
Layouts
- Replaced
{Rgraphviz}(Bioconductor) withigraph::layout_with_sugiyamafor Sugiyama/hierarchy layouts, removing the Bioconductor dependency - Improved Sugiyama layout with dummy node insertion and barycenter crossing minimisation for better edge routing
- Fixed #18 for lattice layout snapping by rotating the layout to optimise edge verticality and horizontality
autograph 0.5.1
Plotting
- Improved
plot.gof.ergm()(closes #31)- Now works on directed and two-mode networks and dyadwise shared partners
- Now has more informative error message if statistic not available
- Now accepts more descriptive and gof-formula consistent statistic names
autograph 0.5.0
CRAN release: 2025-11-19
Plotting
- Added
plot.goldfish.changepoints() - Added
plot.goldfish.outliers() - Added
plot.mnet()to avoidigraph::plot.igraph()dispatching
Graphing
- Restructured scripts for improved maintenance and development in the future
- Fixed
ggplot2::geom_violin()call ingraphr()to avoid warnings with ggplot2 v4.0.0 - Improved
graphr()internals to rely on a NULL “layout” parameter and.infer_layout() - Improved
graphr()to usematch_color()for diffusion palettes - Fixed
graphs()handling of changing networks
autograph 0.4.2
Plotting
- Fixed node overflow issue and restored marginal density plot in
plot.ag_conv()by dropping+.ggplot() - Added automatic legend labelling where node_size or node_color or edge_color is given
autograph 0.4.1
CRAN release: 2025-09-11
Plotting
- Improved ergm convergence diagnostic plotting by working on the results object, mostly avoiding startup conflict warning
- Dropped marginal density plot in
plot.ag_conv()to fix ggplot2 v4.0.0-related node overflow issue
autograph 0.4.0
CRAN release: 2025-09-10
Package
- Fixed DOI in CITATION
- Improved README introduction
- Improved README graphing illustration, including igraph comparison figure
- Improved README plotting illustration, added SAOM/ERGM GOF comparison figure
Theming
- Improved
stocnet_theme()documentation - Improved
stocnet_theme()to register a font family for plots- A vector of potential fonts is included for some themes
- The first font found on the system will be used, and user notified
- If no fonts are found, the default R font (“sans”) will be used
- A message is printed to inform the user if the default is used, and how to install missing fonts via extrafont
- Added font options for “iheid”, “oxf”, “ethz”, “uzh”, and “rug” themes
- Added
ag_font()for retrieving the registered font family - Improved
match_colors()documentation - Exported
is_dark()and made it vectorised - Added
match_colors()andis_dark()tests - Dropped
theme_*()functions in favour ofstocnet_theme() - Dropped
theme_*()tests - Added
stocnet_theme()tests - Added “cmu” theme for Carnegie Mellon University
Graphing
- Improved
graphr()by using registered fonts where available - Improved
graphr()by usingag_qualitative()for discrete colour scales
Plotting
- Improved
plot.selectionTable()andplot.influenceTable()documentation by consolidating them together into one help file - Improved
plot.ag_conv(),plot.ag_gof(), and plot_interp by using registered fonts where available - Improved
plot.sienaGOF()to use lower case auxiliary statistic description
autograph 0.3.1
Plotting
- Added
plot.ag_conv()as a new plotting method for convergence diagnostics- Plots MCMC traces as a line plot with loess smoothing highlighting the trend
- Plots overall density plot of the samples on the right margin
- Improved plotting of
{MoNAn}trace objects by usingplot.ag_conv() - Added
plot.mcmc.list()for plotting MCMC samples fromergm::ergmresults objects, usingplot.ag_conv()
autograph 0.3.0
Package
- Added package documentation
- Added citation
- Dropped dependencies tidyr, cli, and concaveman
- Added more description to the function overview sections on the website
- Added CODECOV_TOKEN to Github secrets for test coverage reporting
Graphing
- Fixed
graphr()not using theme colours for node and edge aesthetics
Plotting
- Added new plot class and method for centralising GOF plotting
- Improved
plot.sienaGOF()andplot.gof.stats.monan()to use new plotting method - Added
plot.gof.ergm()for plotting ERGM GOF objects - Improved GOF plotting by adding boxplot within the violins
- Improved GOF plotting by adding crosses for outliers
- Improved GOF plotting by adding dashed line for 0.05 and 0.95 quantile bounds
- Improved GOF plotting by dropping statistics without variance
- Improved GOF plotting by using
cumulative = FALSEby default
- Improved
- Fixed issue with pre-v1.3.20 RSiena::gof() objects, thanks @TomSnijders
- Added testing of GOF plotting
- Added testing of measures plotting
Theming
- Added
set_stocnet_theme()alias forstocnet_theme() - Fixed issue with ‘oxf’ and ‘unige’ themes not being recognised
Data
- Added
res_ergm_goffor testing and illustration ofplot.gof.ergm()
Tutorial
- Added visualisation tutorial from manynet
- Improved introduction
- Improved section on titles, labels, and legends
- Improved section explaining base and grid graphics
- Added section demonstrating difference between
igraph::plot(),ggraph::ggraph(), andgraphr() - Added table describing the main arguments of
graphr()and the visualisation dimensions to which they relate - Added section showing how to use “node_shape” (poorly)
- Improved section showing how to use “node_colour” and “node_group”
- Added section showing how to use “node_size”
- Added section showing how to set a theme
- Added section showing how to use “edge_colour” and “edge_size”
- Improved section introducing patchwork,
graphs(), andgrapht() - Added plotting section to viz tutorial
autograph 0.2.0
CRAN release: 2025-08-22
Plotting
- Added
graphr(),graphs(), andgrapht()from manynet for quick plotting of one or more graphs - Improved
+.ggplot()to check whether second object inherits ggplot class (thanks @teunbrand for fixing #110) - Fixed issue with edge_linetype in signed, directed networks with weights (closed #14)
- Updated README with examples of
graphr()and others
Themes
- Added themes for Oxford and UNIGE (closed #1)
- Improved
stocnet_theme()to add option to “stocnet_theme” (previously “snet_theme”) - Added
is_dark()to check whether a theme is dark or light - Added
match_color()to return closest matching colors from a palette
Layouts
- Added layout_valence() for signed graphs (closed #6)
- Added configurational layouts from manynet
- Added aliases for various layout_tbl_graph_*() functions
autograph 0.1.2
CRAN release: 2025-07-02
Themes
- Fixed default for
ag_sequential()
MoNAn
- Added
plot.traces.monan() - Added
plot.gof.stats.monan()
autograph 0.1.0
Theming
- Added
stocnet_theme()for setting a theme that can then be reused across successive plots (closes #3)- For example,
stocnet_theme("iheid")for IHEID colour theme
- For example,
- Added
ag_*()palettes, for example:-
ag_highlight()to select the highlight colours of a particular palette
-
- Added
match_color()for matching one or more hexcodes to a palette’s offerings
Plotting
- Added manynet plot methods
- Added
plot.diff_model() - Added
plot.matrix() - Added
plot.learn_model() - Added
plot.network_measures() - Added
plot.network_motif() - Added
plot.tie_measure() - Added
plot.node_measure() - Added
plot.node_member() - Added
plot.node_members() - Added
plot.node_motif()
- Added
- Added migraph plot methods
- Added
plot.netlm() - Added
plot.netlogit() - Added
plot.network_test() - Added
plot.diffs_model()
- Added
- Added RSiena plot methods
- Added
plot.sienaGOF() - Added
plot.influenceTable() - Added
plot.selectionTable()
- Added
Layouts
- Added
layout_tbl_graph_matching()for positioning nodes according to theirmanynet::to_matching()partners - Added first version of
layout_tbl_graph_layered()for layering nodes according to a Sugiyama-type layout
