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:

 [here](https://johngodlee.xyz/files/cc_logos_r/sample_image.png)
 [1](https://johngodlee.xyz/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")

 ![R hexagon logo from R primitive
graphics](https://johngodlee.xyz/img_full/cc_logos_r/result.png)