::p_load(plotly, ggtern, tidyverse) pacman
Visual Creating Ternary Plot with R
Visual Correlation Analysis
Note: Last modified to include author’s details.
1. Getting Started
1.1 Install and launch R packages
For the purpose of this exercise, the following R packages will be used, they are:
ggtern, a ggplot extension specially designed to plot ternary diagrams. The package will be used to plot static ternary plots.
Plotly R, an R package for creating interactive web-based graphs via plotly’s JavaScript graphing library, plotly.js . The plotly R libary contains the ggplotly function, which will convert ggplot2 figures into a Plotly object.
1.2 Import the data
This exercise uses the dataset respopagsex2000to2018_tidy.csv from Singapore Residents by Planning AreaSubzone, Age Group, Sex and Type of Dwelling, June 2000-2018.
Show code
<- read_csv("data/respopagsex2000to2018_tidy.csv") pop_data
1.3 Overview of the data
Show code
summary(pop_data)
PA SZ AG Year
Length:108126 Length:108126 Length:108126 Min. :2000
Class :character Class :character Class :character 1st Qu.:2004
Mode :character Mode :character Mode :character Median :2009
Mean :2009
3rd Qu.:2014
Max. :2018
Population
Min. : 0.0
1st Qu.: 0.0
Median : 140.0
Mean : 644.1
3rd Qu.: 800.0
Max. :14560.0
1.4 Preparing the data
Show code
# Deriving the young, economy active and old measures
<- pop_data %>%
agpop_mutated mutate(`Year` = as.character(Year))%>%
spread(AG, Population) %>%
mutate(YOUNG = rowSums(.[4:8]))%>%
mutate(ACTIVE = rowSums(.[9:16])) %>%
mutate(OLD = rowSums(.[17:21])) %>%
mutate(TOTAL = rowSums(.[22:24])) %>%
filter(Year == 2018)%>%
filter(TOTAL > 0)
2. Plotting Static Ternary Diagram
Use ggtern() function of ggtern package to create a simple ternary plot.
Show code
# To build the static ternary plot
ggtern(data=agpop_mutated,aes(x=YOUNG,y=ACTIVE, z=OLD)) +
geom_point()
Use theme_rgbw() to add theme.
Show code
# Add theme
ggtern(data=agpop_mutated, aes(x=YOUNG,y=ACTIVE, z=OLD)) +
geom_point() +
labs(title="Population structure, 2015") +
theme_rgbw()
3. Plotting Interactive Ternary Diagram
Use plot_ly() function of Plotly R to create interactive ternary plot.
Show code
# reusable function for creating annotation object
<- function(txt) {
label list(
text = txt,
x = 0.1, y = 1,
ax = 0, ay = 0,
xref = "paper", yref = "paper",
align = "center",
font = list(family = "serif", size = 15, color = "white"),
bgcolor = "#b3b3b3", bordercolor = "black", borderwidth = 2
)
}
# reusable function for axis formatting
<- function(txt) {
axis list(
title = txt, tickformat = ".0%", tickfont = list(size = 10)
)
}
<- list(
ternaryAxes aaxis = axis("Young"),
baxis = axis("Active"),
caxis = axis("Old")
)
# Initiating a plotly visualisation
plot_ly(
agpop_mutated, a = ~YOUNG,
b = ~ACTIVE,
c = ~OLD,
color = I("black"),
type = "scatterternary"
%>%
) layout(
annotations = label("Ternary Markers"),
ternary = ternaryAxes
)
4. Self-exploratory using Tenary R Package
There is a R package Ternary that allows creation of ternary plots. This section is a self-exploratory exercise to experiment the Ternary package.
Show code
library(Ternary)
Functions such as TernaryPlot()
, TernaryText()
and TenaryPoints()
can be used to create the ternaryplot and build on aesthetic elements.
The two charts below are plotted side-by-side in opposite directions (i.e. right and left).
Show code
par(mfrow = c(1, 2), mar = rep(0.5, 4)) # create row/ column & set margin
for (dir in c("right", "le")) # other directions include: "up", down"
{ TernaryPlot(point = dir, atip = "A", btip = "B", ctip = "C",
alab = "Young", blab = "Old", clab = "Active",
lab.col = c("salmon", "#808000", "#6666ff"),
lab.cex = 0.8, grid.minor.lines = 0,
grid.lty = "solid", col = rgb(0.9, 0.9, 0.9), grid.col = "white",
axis.col = rgb(0.6, 0.6, 0.6), ticks.col = rgb(0.6, 0.6, 0.6),
axis.rotate = FALSE,
padding = 0.08)
# Add text
TernaryText(list(A = c(10, 1, 1), B = c(1, 10, 1), C = c(1, 1, 10)),
labels = c("P1", "P2", "P3"),
col = "grey", font = 2)
# Add data points
TernaryPoints(agpop_mutated[, c("YOUNG", "OLD", "ACTIVE")],
col = "grey20",
pch = 16)
# Add title
title(paste0("Tenary Plot Direction: ", dir), cex.main = 0.8)
}