Making Merry Christmas Tree in R
In this blog post, I ll show that how we can generate data for christmas tree and plot it using R.
Load libraries
library(tidyverse)
library(mlbench)
library(viridis)
Generating data for the tree
At first, I’ll generate data for the canopy (triangular format) and stem of the tree.
Canopy
There are many ways to generate data but it can be tricky to generate data based on a specific shape. I found an easy way to generate data for basic shapes formats i.e., square, circle or triangle to name a few. R package mlbench
provides functions to to generate datasets of various shapes. I used mlbench.shapes
function that generates data on the pattern of a Gaussian, square, triangle and wave in 2 dimensions.
set.seed(12345)
data <- mlbench.shapes(n=100000)
plot(data)
# Extract trianglular data = class 3
canopy <- data %>%
as.data.frame() %>%
filter(classes == "3")
# plot canopy data
plot(canopy$x.x4, canopy$x.V2, col = "darkgreen", xlab = "x", ylab = "y")
Tree stem
For tree stem, I’ll generate a small rectangular data frame that we can add under canopy.
y <- c(0.8, 1, 1, 0.8)
x <- c(00.8, 00.8, 1.2, 1.2)
# bind columns as a data frame
trunk = as.data.frame(cbind(x, y))
# plot data
plot(x, y)
polygon(x, y, col = 'brown')
Christmas tree
Now I’ll plot the tree using different plotting functions in ggplot2
package of R
.
Points
p1 <- ggplot() +
geom_polygon(aes(x = x, y = y), data = trunk, fill = "brown") +
geom_point(aes(x = x.x4, y = x.V2), shape = 3, data = canopy, colour = "darkgreen") +
theme_void()
p1
Hexagons
p2 <- ggplot() +
geom_polygon(aes(x = x, y = y), data = trunk, fill = "brown") +
geom_hex(aes(x = x.x4, y = x.V2), data = canopy) +
scale_fill_viridis() +
theme_void() +
theme(legend.position = "none")
p2
2-D Bins
p3 <- ggplot() +
geom_polygon(aes(x = x, y = y), data = trunk, fill = "brown") +
geom_bin2d(aes(x = x.x4, y = x.V2), data = canopy) +
scale_fill_viridis() +
theme_void() +
theme(legend.position = "none")
p3
2-D Density
p4 <- ggplot() +
geom_polygon(aes(x = x, y = y), data = trunk, fill = "brown") +
stat_density_2d(aes(x = x.x4, y = x.V2, fill = ..level..), data = canopy, geom = "polygon") +
scale_fill_viridis() +
theme_void() +
theme(legend.position = "none")
p4
Combine all trees
library(patchwork)
p1 + p2 + p3 + p4 + plot_annotation(
title = 'Merry Christmas 2021',
theme = theme(plot.title = element_text(size = 18, hjust = 0.5)))
If you like it, please share with others also!