| Title: | Data Visualization for IP Addresses and Networks | 
| Version: | 0.3.2 | 
| Description: | A 'ggplot2' extension that enables visualization of IP (Internet Protocol) addresses and networks. The address space is mapped onto the Cartesian coordinate system using a space-filling curve. Offers full support for both IPv4 and IPv6 (Internet Protocol versions 4 and 6) address spaces. | 
| License: | MIT + file LICENSE | 
| URL: | https://davidchall.github.io/ggip/, https://github.com/davidchall/ggip | 
| BugReports: | https://github.com/davidchall/ggip/issues | 
| Depends: | ggplot2 (≥ 3.4.0), ipaddress (≥ 1.0.0) | 
| Imports: | cli, dplyr, Rcpp, rlang (≥ 1.0.0), tidyr, vctrs | 
| Suggests: | knitr, rmarkdown, testthat | 
| LinkingTo: | ipaddress, Rcpp | 
| VignetteBuilder: | knitr | 
| Config/testthat/edition: | 3 | 
| Encoding: | UTF-8 | 
| RoxygenNote: | 7.2.3 | 
| NeedsCompilation: | yes | 
| Packaged: | 2023-04-04 04:01:24 UTC; davidhall | 
| Author: | David Hall | 
| Maintainer: | David Hall <david.hall.physics@gmail.com> | 
| Repository: | CRAN | 
| Date/Publication: | 2023-04-04 04:10:02 UTC | 
ggip: Data Visualization for IP Addresses and Networks
Description
 
A 'ggplot2' extension that enables visualization of IP (Internet Protocol) addresses and networks. The address space is mapped onto the Cartesian coordinate system using a space-filling curve. Offers full support for both IPv4 and IPv6 (Internet Protocol versions 4 and 6) address spaces.
Author(s)
Maintainer: David Hall david.hall.physics@gmail.com (ORCID)
See Also
Useful links:
- Report bugs at https://github.com/davidchall/ggip/issues 
Coordinate system for IP data
Description
A ggplot2 coordinate system that maps a range of IP address space onto a two-dimensional grid using a space-filling curve.
coord_ip() forms the foundation of any ggip plot. It translates all
ip_address and ip_network
vectors to Cartesian coordinates, ready for use by ggplot2 layers (see
Accessing Coordinates). This ensures all layers use a common mapping.
Usage
coord_ip(
  canvas_network = ip_network("0.0.0.0/0"),
  pixel_prefix = 16,
  curve = c("hilbert", "morton"),
  expand = FALSE
)
Arguments
| canvas_network | An  | 
| pixel_prefix | An integer scalar that sets the prefix length of the network represented by a single pixel. The default value is 16. Increasing this effectively improves the resolution of the plot. | 
| curve | A string to choose the space-filling curve. Choices are
 | 
| expand | If  | 
Accessing Coordinates
coord_ip() stores the result of the mapping in a nested data frame column.
This means each ip_address or
ip_network column in the original data set is
converted to a data frame column. When specifying ggplot2 aesthetics, you'll
need to use $ to access the nested data (see Examples).
Each ip_address column will be replaced with a
data frame containing the following columns:
| Column name | Data type | Description | 
| ip | ip_address | Original IP data | 
| x | integer | Pixel x | 
| y | integer | Pixel y | 
Each ip_network column will be replaced with a
data frame containing the following columns:
| Column name | Data type | Description | 
| ip | ip_network | Original IP data | 
| xmin | integer | Bounding box xmin | 
| ymin | integer | Bounding box ymin | 
| xmax | integer | Bounding box xmax | 
| ymax | integer | Bounding box ymax | 
See Also
vignette("visualizing-ip-data") describes the mapping in more detail.
Examples
suppressPackageStartupMessages(library(dplyr))
tibble(address = ip_address(c("0.0.0.0", "128.0.0.0", "192.168.0.1"))) %>%
  ggplot(aes(x = address$x, y = address$y, label = address$ip)) +
  geom_point() +
  geom_label(nudge_x = c(10, 0, -10), nudge_y = -10) +
  coord_ip(expand = TRUE) +
  theme_ip_light()
tibble(network = ip_network(c("0.0.0.0/8", "224.0.0.0/4"))) %>%
  mutate(
    start = network_address(network),
    end = broadcast_address(network)
  ) %>%
  ggplot() +
  geom_point(aes(x = start$x, y = start$y), color = "blue") +
  geom_point(aes(x = end$x, y = end$y), color = "red") +
  geom_rect(
    aes(xmin = network$xmin, xmax = network$xmax, ymin = network$ymin, ymax = network$ymax),
    alpha = 0.5, fill = "grey"
  ) +
  coord_ip(curve = "morton", expand = TRUE) +
  theme_ip_light()
Hilbert curve outline
Description
Computes and draws the outline of the Hilbert curve used to map IP data to the Cartesian plane. By superimposing this outline on top of a ggip plot, it guides the eye to regions that are close in IP address space.
Usage
geom_hilbert_outline(
  mapping = NULL,
  data = NULL,
  ...,
  na.rm = FALSE,
  show.legend = NA,
  inherit.aes = TRUE
)
Arguments
| mapping | Set of aesthetic mappings created by  | 
| data | The data to be displayed in this layer. There are three options: If  A  A  | 
| ... | Other arguments passed on to  | 
| na.rm | If  | 
| show.legend | logical. Should this layer be included in the legends?
 | 
| inherit.aes | If  | 
Aesthetics
geom_curve_outline() understands the following aesthetics:
-  ip: Anip_networkcolumn. By default, the entire Hilbert curve is shown.
-  curve_order: How nested is the curve? (default:3).
-  closed: Should the curve outline have closed ends? (default:FALSE).
-  alpha
-  colour
-  linetype
-  linewidth
Computed variables
- x, y
- The start coordinates for the segment 
- xend, yend
- The end coordinates for the segment 
Examples
p <- ggplot() + coord_ip() + theme_ip_light()
# default shows curve across entire canvas
p + geom_hilbert_outline()
# only show subnetwork
p + geom_hilbert_outline(ip = ip_network("128.0.0.0/2"))
# increased nesting
p + geom_hilbert_outline(curve_order = 4)
# show multiple networks
df <- data.frame(
  ip = ip_network(c("0.0.0.0/2", "128.0.0.0/4")),
  curve_order = c(4, 5),
  closed = c(FALSE, TRUE)
)
p + geom_hilbert_outline(
  aes(ip = ip, curve_order = curve_order, closed = closed),
  data = df
)
Map IP data to Cartesian coordinates
Description
These functions are used internally by coord_ip() to map
ip_address and ip_network
vectors to Cartesian coordinates. They are exposed externally to support use
of these coordinates outside of ggplot2.
Usage
address_to_cartesian(
  address,
  canvas_network = ip_network("0.0.0.0/0"),
  pixel_prefix = 16,
  curve = c("hilbert", "morton")
)
network_to_cartesian(
  network,
  canvas_network = ip_network("0.0.0.0/0"),
  pixel_prefix = 16,
  curve = c("hilbert", "morton")
)
Arguments
| address | An  | 
| canvas_network | An  | 
| pixel_prefix | An integer scalar that sets the prefix length of the network represented by a single pixel. The default value is 16. Increasing this effectively improves the resolution of the plot. | 
| curve | A string to choose the space-filling curve. Choices are
 | 
| network | An  | 
Value
A data.frame containing columns:
-  address_to_cartesian():xandy
-  network_to_cartesian():xmin,ymin,xmaxandymax
Examples
address_to_cartesian(ip_address("192.168.0.1"))
network_to_cartesian(ip_network("224.0.0.0/4"))
Summarize IP addresses on a heatmap
Description
Addresses are grouped into networks determined by the pixel_prefix argument
of coord_ip(). Then the z values are summarized with summary function fun.
Usage
stat_summary_address(
  mapping = NULL,
  data = NULL,
  ...,
  fun = NULL,
  fun.args = list(),
  na.rm = FALSE,
  show.legend = NA,
  inherit.aes = TRUE
)
Arguments
| mapping | Set of aesthetic mappings created by  | 
| data | The data to be displayed in this layer. There are three options: If  A  A  | 
| ... | Other arguments passed on to  | 
| fun | Summary function (see section below for details). If  | 
| fun.args | A list of extra arguments to pass to  | 
| na.rm | If  | 
| show.legend | logical. Should this layer be included in the legends?
 | 
| inherit.aes | If  | 
Aesthetics
stat_summary_address() understands the following aesthetics (required
aesthetics are in bold):
-  ip: Anip_addresscolumn
-  z: Value passed to the summary function (required iffunis used)
-  fill: Default isafter_stat(value)
-  alpha
Computed variables
The following variables are available to after_stat():
-  value: Value of summary statistic
-  count: Number of observations
Summary function
The data might contain multiple rows per pixel of the heatmap, so a summary
function reduces this information to a single value to display.
This function receives the data column specified by the z aesthetic
and also receives arguments specified by fun.args.
The fun argument can be specified in multiple ways:
- NULL
- If no summary function is provided, the number of observations is computed. In this case, you don't need to specify the - zaesthetic, and the computed variables- valueand- countwill be equal.
- string
- The name of an existing function (e.g. - fun = "mean").
- function
- Either provide an existing function (e.g. - fun = mean) or define a new function (e.g.- fun = function(x) sum(x^2)).
- formula
- A function can also be created from a formula. This uses - .xas the summarized variable (e.g.- fun = ~ sum(.x^2)).
Examples
dat <- data.frame(
  ip = sample_ipv4(10000),
  weight = runif(10000)
)
p <- ggplot(dat, aes(ip = ip)) +
  coord_ip() +
  theme_ip_light()
# simple count of observations
p +
  stat_summary_address() +
  scale_fill_viridis_c(trans = "log2", na.value = "black", guide = "none")
# compute mean weight
p +
  stat_summary_address(aes(z = weight), fun = ~ mean(.x)) +
  scale_fill_viridis_c(na.value = "black", guide = "none")
Themes for IP data
Description
These set sensible defaults for plots generated by ggip.
Use ggplot2::theme() if you want to tweak the results.
Usage
theme_ip_light(base_size = 11, base_family = "")
theme_ip_dark(
  background_color = "black",
  text_color = "white",
  base_size = 11,
  base_family = ""
)
Arguments
| base_size | base font size, given in pts. | 
| base_family | base font family | 
| background_color | Background color | 
| text_color | Text color | 
Examples
p <- ggplot(data.frame(ip = ip_address("128.0.0.0"))) +
  geom_point(aes(x = ip$x, y = ip$y), color = "grey") +
  coord_ip()
p + theme_ip_light()
p + theme_ip_dark()