TITLE: Making Coding Club logos in R
DATE: 2017-09-27
AUTHOR: John L. Godlee
====================================================================


A previous post showcased the new Coding Club logos that I made for
our website. Seeing as the website is all about programming in R I
thought it would be a fruitful exercise to attempt to make a logo
template in R, using ggplot2. the result is a lot of experimentation
with tge graphical primitive functions in ggplot2 and a quick dabble
in how to import .png images and create raster arrays for them in R.

I still haven’t figured out a reliable and intuitive way to create
png objects of the ggplot2 output, I tried using png() but the
proportions always went way off and I don’t have time to fiddle with
the dimension options and all their interactions with the options in
ggplot2.

First do the usual, setwd, packages, import data etc.. If you want
to try and follow along, sample_image.png can be found [here] and
the script file I used is [here][1]:

  [here]: https://johngodlee.github.io/files/cc_logos_r/sample_image.png
  [1]: https://johngodlee.github.io/files/cc_logos_r/hexagons.R

    # Set working directory to the location of the source file
    setwd(dirname(rstudioapi::getActiveDocumentContext()$path))

    # Packages
    library(grid)
    library(ggplot2)
    library(png)

    # Image
    img <- readPNG("sample_image.png")
    g <- rasterGrob(img, interpolate=TRUE, width = 0.5)
    ggplot() + annotation_custom(g)

Then I can start to construct the hexagon logo shape using vectors
of point locations on a grid:

    # Hexagon
    ord_hex <- c(1, 2, 3, 4, 5, 6, 7, 8)
    x_hex <- c(-10, -5, 5, 10, 5, -5, -10, -5)
    y_hex <- c(-0, 10, 10, 0, -10, -10, -0, 10)
    hex <- data.frame(ord_hex, x_hex, y_hex)

    # Shade
    ord_shad_main <- c(1, 2, 3, 4)
    x_shad_main <- c(-4.8, 5.3, 10.5, 5.5)
    y_shad_main <- c(10.5, 10.5, 0, -10)
    shad_main <- data.frame(ord_shad_main, x_shad_main, y_shad_main)

    ord_shad_bot <- c(1, 2)
    x_shad_bot <- c(5.5, 0)
    y_shad_bot <- c(-10, -10)
    shad_bot <- data.frame(ord_shad_bot, x_shad_bot, y_shad_bot)

    ord_shad_top <- c(1, 2)
    x_shad_top <- c(-4.8, -7.5)
    y_shad_top <- c(10.5, 5)
    shad_top <- data.frame(ord_shad_top, x_shad_top, y_shad_top)

    # Clipping mask
    org_clip_l <- c(1, 2, 3, 4, 5)
    x_clip_l <- c(-4.8, -30, -30, -5, -10)
    y_clip_l <- c(10.6, 10.6, -10.2, -10.2, 0)
    clip_l <- data.frame(org_clip_l, x_clip_l, y_clip_l)

    org_clip_r <- c(1, 2, 3, 4, 5)
    x_clip_r <- c(5.3, 30, 30, 5.5, 10.5)
    y_clip_r <- c(10.6, 10.6, -10.2, -10.2, 0)
    clip_r <- data.frame(org_clip_r, x_clip_r, y_clip_r)

    org_clip_t <- c(1, 2, 3, 4)
    x_clip_t <- c(-30, -30, 30, 30)
    y_clip_t <- c(10.5, 30, 30, 10.5)
    clip_t <- data.frame(org_clip_t, x_clip_t, y_clip_t)

    org_clip_b <- c(1, 2, 3, 4)
    x_clip_b <- c(-30, 30, 30, -30)
    y_clip_b <- c(-10, -10, -30, -30)
    clip_b <- data.frame(org_clip_b, x_clip_b, y_clip_b)

    # Text
    text <- c("TEST")

To test all the above works I just plot it as wires, with the points
in the vectors visible:

    # Test
    ggplot() +
        geom_point(data = hex, aes(x = x_hex, y = y_hex)) +
        geom_path(data = shad_main, aes(x = x_shad_main, y = y_shad_main), color = "grey") +
        geom_path(data = shad_top, aes(x = x_shad_top, y = y_shad_top), color = "grey") +
        geom_path(data = shad_bot, aes(x = x_shad_bot, y = y_shad_bot), color = "grey") +
        geom_path(data = hex, aes(x = x_hex, y = y_hex), color = "orange") +
        geom_text(aes(x = 0, y = -5, label = text), size = 25) +
        geom_polygon(data = clip_l, aes(x = x_clip_l, y = y_clip_l), fill = "white") +
        geom_polygon(data = clip_r, aes(x = x_clip_r, y = y_clip_r), fill = "white") +
        geom_polygon(data = clip_t, aes(x = x_clip_t, y = y_clip_t), fill = "white") +
        geom_polygon(data = clip_b, aes(x = x_clip_b, y = y_clip_b), fill = "white")

And now to do a trial run to see if the code works properly with the
image. Be warned, RAM usage!:

    ggplot() +
        annotation_custom(g) +
        geom_polygon(data = clip_l, aes(x = x_clip_l, y = y_clip_l), fill = "white") +
        geom_polygon(data = clip_r, aes(x = x_clip_r, y = y_clip_r), fill = "white") +
        geom_polygon(data = clip_t, aes(x = x_clip_t, y = y_clip_t), fill = "white") +
        geom_polygon(data = clip_b, aes(x = x_clip_b, y = y_clip_b), fill = "white") +
        geom_path(data = shad_main, aes(x = x_shad_main, y = y_shad_main), color = "grey", size = 5, lineend = "round") +
        geom_path(data = shad_bot, aes(x = x_shad_bot, y = y_shad_bot), color = "grey", size = 5, lineend = "round") +
        geom_path(data = shad_top, aes(x = x_shad_top, y = y_shad_top), color = "grey", size = 5, lineend = "round") +
        geom_path(data = hex, aes(x = x_hex, y = y_hex), color = "orange", size = 5) +
        geom_text(aes(x = 0, y = -5, label = "TEST"), size = 15) +
        theme(axis.title = element_blank(),
                    axis.text = element_blank(),
                    axis.ticks = element_blank(),
                    panel.grid.major.x = element_blank(),
                    panel.grid.minor.x = element_blank(),
                    panel.grid.minor.y = element_blank(),
                    panel.grid.major.y = element_blank(),
                    panel.background = element_blank(),
                    legend.position = "none")

  {IMAGE}