R Bootcamp - Problem Set 5 (Extreme aRt)

Author

Your Name Here

Published

August 14, 2026

Extreme aRt — Objective

Your objective is to create some new extreme art using R, something either ugly or sublime. What you cannot do is be boring; your goal is to stay on the fringe.

Your submission (a Quarto .qmd file) is due Tues Sept 2 by 5pm. If you submit an entry, you get full credit on the problem set. Entries will be anonymized and winners will selected by popular vote.

Favorite Rtists

Here are some of my favorite generative artists who use R. Be inspired!

There are several resources for color palettes, an important component of any hideous or beautiful creation.

There are also several R packages that might help you build Rtistic plots.

  • gganimate provides tools to bring your plots to life.
  • ggforce provides interesting geoms that build on ggplot2.
  • patchwork provides layout functions for plots.

Informative, but boring.

This is an informative but relatively boring plot. NOT THE GOAL HERE.

Code
library(tidyverse)
library(palmerpenguins)
library(cowplot)

penguins_clean <- drop_na(penguins)

ggplot(
  penguins_clean,
  aes(
    x = body_mass_g / 1000,
    y = bill_length_mm
  )
) +
  geom_point(
    aes(
      shape = sex,
      color = species
    )
  ) +
  facet_grid(~island) +
  theme_minimal_grid() +
  scale_color_brewer(palette = "Dark2") +
  labs(
    title = "Analysis of geographic isolation on penguin phenotypes",
    x = "Body mass (kg)",
    y = "Bill length (mm)"
  )

Scatter plot of bill length against body mass for the palmer penguins, faceted by island, with color showing species and point shape showing sex.

Ugly Plots

Yikes. We can thank Yunus Ozekin for this abomination.

Code
library(tidyverse)
titanic_tbl <- as_tibble(Titanic)

ggplot(
  titanic_tbl,
  aes(
    x = Survived,
    y = n,
    color = Class,
    shape = Sex,
    size = 6
  )
) +
  geom_jitter() +
  scale_y_sqrt() +
  labs(
    x = "Not Dead?",
    y = "How many? (ppl)",
    title = "WhO dIEd In titaNic?",
    caption = "Some lived, some died."
  ) +
  scale_x_discrete(position = "top") +
  theme(
    axis.text.x = element_text(
      face = "bold.italic",
      color = "#993333",
      size = 18,
      angle = 180
    ),
    axis.text.y = element_text(
      face = "bold",
      color = "orange",
      size = 18,
      angle = 135
    ),
    plot.background = element_rect(fill = "darkblue"),
    plot.title = element_text(
      face = "italic",
      color = "green",
      size = 48,
      angle = 183
    ),
    plot.caption = element_text(color = "white", size = 22),
    axis.title.x = element_text(size = 22, color = "pink", angle = 12),
    axis.title.y = element_text(color = "yellow", angle = 273, size = 17),
    legend.background = element_rect(fill = "yellow"),
    legend.title = element_text(
      angle = 71,
      face = "bold",
      color = "purple",
      size = 12
    ),
    legend.key = element_rect(color = "green", fill = "orange"),
    legend.text = element_text(color = "red", size = 14),
    panel.background = element_rect(fill = "yellow"),
    panel.grid.major.y = element_line(
      color = "green",
      linetype = "dotdash",
      linewidth = 1.2
    ),
    panel.grid.major.x = element_line(
      color = "purple",
      linewidth = 3,
      linetype = "twodash"
    ),
    panel.grid.minor = element_line(
      color = "red",
      linewidth = 2,
      linetype = "dashed"
    ),
    legend.position = "bottom"
  )

A deliberately awful Titanic plot: jittered counts of survival on a square-root y axis, over a dark blue background with clashing rotated axis text, a rotated green title, and a yellow legend, used as an example of what not to do.

Beautiful Plots

This is a piece from Ijeamaka Anyene’s ode to coord_polar() (link above). Reminds me of Miro.

Code
library(tidyverse)

apply_pattern_theme <- function(bg_hex, caption_hex) {
  theme(
    plot.background = element_rect(fill = bg_hex),
    panel.background = element_rect(fill = bg_hex),
    panel.grid = element_blank(),
    plot.caption = element_text(
      family = "Open Sans",
      size = 6,
      color = caption_hex
    ),
    legend.position = "none",
    axis.title = element_blank(),
    axis.text = element_blank(),
    axis.ticks = element_blank()
  )
}

outline <- tibble(
  x = 1,
  xend = 7,
  y = 15,
  yend = 15
)
segment_line <- tibble(
  x = c(1, 7),
  xend = c(1, 7),
  y = c(0, 2),
  yend = 15
)
area <- tibble(
  x = c(3, 5, 6),
  y = c(5, 7.5, 2),
  type = LETTERS[1:3]
)
palette_values <- c("#2a2640", "#a64e46", "#f29544")
ggplot() +
  geom_col(
    data = area,
    aes(x = x, y = y, fill = type),
    alpha = 0.75,
    width = 4
  ) +
  geom_segment(
    data = outline,
    aes(
      x = x,
      y = y,
      xend = xend,
      yend = yend
    ),
    size = 0.5
  ) +
  geom_segment(
    data = segment_line,
    aes(
      x = x,
      xend = xend,
      y = y,
      yend = yend
    ),
    size = 0.5
  ) +
  geom_point(aes(x = 5, y = 0)) +
  scale_fill_manual(values = palette_values) +
  scale_y_continuous(limits = c(0, 15)) +
  scale_x_continuous(limits = c(1, 10)) +
  coord_polar() +
  labs(caption = "Ijeamaka Anyene | @ijeamaka_a") +
  apply_pattern_theme(
    bg_hex = "#ded5c9",
    caption_hex = "black"
  )

A polar-coordinate generative art piece: three semi-transparent wedges in navy, red and orange radiating from a common center over a cream background, with black outline segments and an artist credit caption.

Here’s another more complex geometric creation, again using coord_polar(). This will take a few seconds to render.

Code
# https://twitter.com/aschinchon/status/1095057262744387587
library(tidyverse)

xy <- seq(-2, 2, by = .005)
expand.grid(x = xy, y = xy) |>
  ggplot(
    aes(
      x = (cos(x)^2 + sin(y^2)),
      y = (sin(y)^3 - cos(x^2))
    )
  ) +
  geom_point(alpha = .01, shape = 20, size = 0) +
  theme_void() +
  coord_polar()