Search code examples
rggplot2ggtern

Convex Hull for Ternary plot using ggtern in R


Polynators convex hull Area

Consider the following data.frame

DGChi <- structure(list(Sucrose = c(42, 40, 15, 19, 33, 49, 35, 31, 22, 
25, 37, 28, 31, 41, 27, 28, 33, 43, 21, 37, 14, 41, 30, 34, 38, 
40, 40, 33, 33), Fructose = c(27, 29, 41, 35, 29, 23, 27, 33, 
38, 38, 28, 31, 29, 26, 32, 34, 31, 28, 40, 30, 39, 27, 32, 31, 
29, 28, 28, 32, 29), Glucose = c(31, 31, 44, 46, 38, 28, 38, 
36, 40, 37, 35, 41, 40, 33, 41, 38, 36, 30, 39, 33, 47, 32, 38, 
35, 33, 32, 32, 35, 38), Sindrome = c("Chiropterophily", "Chiropterophily", 
"Chiropterophily", "Chiropterophily", "Chiropterophily", "Chiropterophily", 
"Chiropterophily", "Chiropterophily", "Chiropterophily", "Chiropterophily", 
"Chiropterophily", "Chiropterophily", "Chiropterophily", "Chiropterophily", 
"Chiropterophily", "Chiropterophily", "Chiropterophily", "Chiropterophily", 
"Chiropterophily", "Chiropterophily", "Chiropterophily", "Chiropterophily", 
"Chiropterophily", "Chiropterophily", "Chiropterophily", "Chiropterophily", 
"Chiropterophily", "Chiropterophily", "Chiropterophily")), .Names = c("Sucrose", 
"Fructose", "Glucose", "Sindrome"), row.names = c(NA, -29L), class = c("tbl_df", 
"tbl", "data.frame"))

First try

I am trying to make a ternary plot and add a convex hull around the points, my first try was using geom_encircle of the ggalt package:

library(ggtern)
library(ggalt)

ggtern(data = DGChi, aes(x = Fructose, y = Sucrose, z = Glucose, fill = Sindrome)) +
theme_bw() +
geom_encircle(alpha=0.2,size=1, spread = 0.5) +
geom_point() +
theme(legend.position="bottom") 

With this result

enter image description here

Which encircles the points, but is not a convex hull

Second try using the geometry package

Trying to follow my own answer for rgl, I tried this:

library(geometry)
DGChiMin <- as.data.frame(convhulln(matrix(c(DGChi$Fructose, DGChi$Sucrose, DGChi$Glucose), ncol = 3)))
colnames(DGChiMin) <- c("Fructose", "Sucrose", "Glucose")

and then this for the plot:

ggtern(data = DGChi, aes(x = Fructose, y = Sucrose, z = Glucose)) +
  theme_bw() +
  geom_polygon(data = DGChiMin,aes(x = Fructose, y = Sucrose, z = Glucose)) +
  geom_point() +
  theme(legend.position="bottom")

But got this super weird polygon:

enter image description here

Can someone help me get the convex hull plot?


Solution

  • Think you will find that geom_encircle uses chull internally. Set the expand parameter to 0.

    library(ggalt)
    library(ggtern)
    ggtern(data = DGChi, aes(x = Fructose, y = Sucrose, z = Glucose, fill = Sindrome)) +
      theme_bw() +
      geom_encircle(alpha=0.2,size=1, expand=0) + ##<<<<<< expand = 0
      geom_point() +
      theme(legend.position="bottom") 
    

    Output