#' Turns a set of points into hexagons
#'
#' @name make_polygons
#'
#' @param z A data frame containing x, y and id.
#'
#' @description
#' make_polygons takes a set of points (x and y coordinates) and turns them into hexagons.
#' The idea is, that you can quickly design the layout of a hexagon map by just adding points in a coordinate system. Then the hexamap function turns them into hexagon-shaped polygons that can be plotted with ggplot2.
#'
#' @return
#' The function returns a set of hexagons.
#'
#' @export
#'
#' @examples
#' # Load libraries
#' library(hexamapmaker)
#' library(ggplot2)
#' library(tibble)
#' library(ggthemes)
#'
#' # Points on a "normal" grid.
#' my_points <- tibble::tibble(
#' x = c(1, 2, 1, 2, 1, 2, 4, 4),
#' y = c(1, 1, 2, 2, 3, 3, 1, 2),
#' id = c("test1", "test2", "test3", "test4", "test5", "test6", "test7", "test8")
#' )
#'
#' # Plot the points
#' ggplot(my_points, aes(x = x, y = y, group = id)) +
#' geom_point() +
#' coord_fixed(ratio = 1) +
#' theme_map()
#'
#' # Turn points into hexagons
#' hexa_points <- make_polygons(my_points)
#'
#' # Plot the new hexagons
#' ggplot(hexa_points, aes(x, y, group = id)) +
#' geom_polygon(colour = "black", fill = NA) +
#' coord_fixed(ratio = 1) +
#' theme_map()
#'
#' # Oh no! It is way off - lets fix it.
#' my_points <- fix_shape(my_points)
#'
#' # Plot points
#' ggplot(my_points, aes(x = x, y = y, group = id)) +
#' geom_point() +
#' coord_fixed(ratio = 1) +
#' theme_map()
#'
#' # Turn points into hexagons
#' hexa_points <- make_polygons(my_points)
#'
#' ggplot(hexa_points, aes(x, y, group = id)) +
#' geom_polygon(colour = "black", fill = NA) +
#' coord_fixed(ratio = 1) +
#' theme_map()
#'
#' # Add color by using the fill argument in ggplot.
#' # Remember to remove it from the geom_polygon then
#' (p <- ggplot(hexa_points, aes(x, y, group = id, fill = id)) +
#' geom_polygon(colour = "black", show.legend = FALSE) +
#' coord_fixed(ratio = 1) +
#' theme_map())
#'
#' # Label hexagons
#' add_hexalabel(hexa_points, p)
make_polygons <- function(z){
hexadata <- tibble::tibble()
for(i in z$id){
mydata <- z[z$id == i,]
x <- mydata$x + c(-1, -1, 0, 1, 1, 0)
y <- mydata$y + c(0, 1, 1.577, 1, 0, -0.577)
multiplier <- (mydata$y-1)/2
y <- y - 0.423 * multiplier
mydata <- tibble::tibble(id = i, x, y)
hexadata <- dplyr::bind_rows(hexadata, mydata)
}
message(praise::praise("${EXCLAMATION}! Your new hexagon map is ${adjective}!"))
return(hexadata)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.