library(tourr)
#>
#> Attaching package: 'tourr'
#> The following object is masked from 'package:rmarkdown':
#>
#> render
Showing connections between points can be useful in different
applications, including geometric shapes, indicating patterns in
sequential series or showing connections suggested by a model (for
example in clustering). These edges can be added in the 2D scatterplot
display (display_xy
) through the edges
argument, and should be specified as a two column integer matrix of the
indices of ends of lines.
For example, we can generate cube vertices and edges using the
geozoo
package. The information stored as
points
constitutes the input data, and edges
can directly be passed into the display.
# generate 3D cube vertices
cube <- geozoo::cube.iterate(3)
# data is stored points, edges contains the needed two column matrix for connecting points
cube$points
#> Var1 Var2 Var3
#> [1,] 0 0 0
#> [2,] 1 0 0
#> [3,] 0 1 0
#> [4,] 1 1 0
#> [5,] 0 0 1
#> [6,] 1 0 1
#> [7,] 0 1 1
#> [8,] 1 1 1
cube$edges
#> from to
#> 1 1 2
#> 2 1 3
#> 3 1 5
#> 4 2 4
#> 5 2 6
#> 6 3 4
#> 7 3 7
#> 8 4 8
#> 9 5 6
#> 10 5 7
#> 11 6 8
#> 12 7 8
# call grand tour with the scatterplot (xy) display, turning off axes
animate_xy(cube$points, edges = cube$edges, axes = "off")
#> Using half_range 0.87
We can use the same functions for higher dimensional cubes as well (but would not print the data).
cube5 <- geozoo::cube.iterate(5)
animate_xy(cube5$points, edges = cube5$edges, axes = "off")
#> Using half_range 1.1
It can often be useful to connect points with edges, for example sequential points in a time series, or points that are connected by a model. As a simple example we can connect centroids found when clustering the flea dataset:
# get centroids of 3 clusters of the flea data
f <- apply(flea[,1:6], 2, function(x) (x-mean(x))/sd(x))
n <- nrow(f)
set.seed(1019)
flea_centroids <- stats::kmeans((f), 3)$centers
flea_aug <- rbind(f, flea_centroids)
col <- c(rep("black", n), rep("orange", 3))
flea_edges <- matrix(c(n+1, n+2, n+1, n+3, n+2, n+3), ncol=2, byrow = TRUE)
animate_xy(flea_aug, edges = flea_edges,
col = col, edges.col = "orange",
edges.width = 3)
#> Using half_range 4.4