1

I am using ggtern and want to create a plot where the area between points of the triangle is filled/smoothed based on point values at each triangulation point. Something like below... target plot

But what I get so far is... current state

Below some data and code example.

Thank you for your help!

a <- c(1.0, 0.0, 0.0, 0.0, 0.0, 0.9, 0.9, 0.1, 0.1, 0.8, 0.0, 0.0, 0.2, 0.2, 0.8, 0.3, 0.7, 0.0, 0.0, 0.3, 0.7, 0.0, 0.4, 0.0, 0.6, 0.6, 0.4, 0.5, 0.0, 0.5, 0.1, 0.1, 0.8, 0.7, 0.1, 0.2, 0.1, 0.7,
    0.2, 0.6, 0.1, 0.1, 0.6, 0.3, 0.3, 0.1, 0.5, 0.1, 0.4, 0.5, 0.4, 0.6, 0.2, 0.2, 0.3, 0.5, 0.2, 0.5, 0.2, 0.3, 0.4, 0.4, 0.2, 0.3, 0.3, 0.4)
b <- c(0.0, 0.0, 1.0, 0.1, 0.9, 0.0, 0.1, 0.9, 0.0, 0.0, 0.8, 0.2, 0.8, 0.0, 0.2, 0.0, 0.3, 0.7, 0.3, 0.7, 0.0, 0.6, 0.0, 0.4, 0.0, 0.4, 0.6, 0.5, 0.5, 0.0, 0.1, 0.8, 0.1, 0.1, 0.2, 0.7, 0.7, 0.2,
     0.1, 0.1, 0.3, 0.6, 0.3, 0.6, 0.1, 0.4, 0.1, 0.5, 0.1, 0.4, 0.5, 0.2, 0.6, 0.2, 0.5, 0.3, 0.3, 0.2, 0.5, 0.2, 0.4, 0.2, 0.4, 0.4, 0.3, 0.3)
c <- c(0.0, 1.0, 0.0, 0.9, 0.1, 0.1, 0.0, 0.0, 0.9, 0.2, 0.2, 0.8, 0.0, 0.8, 0.0, 0.7, 0.0, 0.3, 0.7, 0.0, 0.3, 0.4, 0.6, 0.6, 0.4, 0.0, 0.0, 0.0, 0.5, 0.5, 0.8, 0.1, 0.1, 0.2, 0.7, 0.1, 0.2, 0.1,
     0.7, 0.3, 0.6, 0.3, 0.1, 0.1, 0.6, 0.5, 0.4, 0.4, 0.5, 0.1, 0.1, 0.2, 0.2, 0.6, 0.2, 0.2, 0.5, 0.3, 0.3, 0.5, 0.2, 0.4, 0.4, 0.3, 0.4, 0.3)
value <- c(1.433, 0.251, 0.000, 0.176, 0.000, 1.556, 1.490, 0.087, 0.522, 1.718, 0.000, 0.098, 0.347, 0.772, 1.642, 1.093, 1.762, 0.000, 0.052, 0.713, 1.857, 0.000, 1.367, 0.022, 1.814,
       1.726, 1.043, 1.424, 0.001, 1.722, 0.428, 0.122, 1.656, 1.798, 0.330, 0.384, 0.138, 1.777, 0.661, 1.763, 0.271, 0.166, 1.733, 0.753, 0.984, 0.236, 1.574, 0.204, 1.232, 1.471,
       1.086, 1.748, 0.409, 0.568, 0.790, 1.505, 0.520, 1.552, 0.451, 0.884, 1.094, 1.180, 0.484, 0.831, 0.859, 1.123)
df <- data.frame(a,b,c,value)

library(ggtern)
ggtern(df,aes(a, b, c)) +
geom_point(size=2, aes(color=value)) +
theme_rgbw()
cblaettle
  • 33
  • 3

1 Answers1

1

Applying the example in the ggtern package documentation you could try this. You'll probably have to experiment with the inputs and arguments to get the result you require, but this should provide a start. Edited arguments to make more like OP request for distinct fill areas and remove points, and grid ontop, now.


library(ggtern)
ggtern(df, aes(a, b, c, value = value)) +
  stat_interpolate_tern(geom="polygon",
                        formula = value~y+x,
                        method = lm,
                        n = 100,
                        breaks = seq(0, 2.5, length.out = 8),
                        aes(fill = ..level..),
                        expand = 1) +
  scale_fill_gradient(low = "green", high = "red")+
  theme_rgbw()+
  theme(tern.panel.grid.ontop = TRUE)

Created on 2021-09-16 by the reprex package (v2.0.0)

Peter
  • 11,500
  • 5
  • 21
  • 31
  • Dear Peter, thanks for your answer and suggestion! I was looking more for a way similar in the example, where the filled area could also be segmented :-/ Is there maybe an alternative package then ggtern that does the trick? – cblaettle Sep 16 '21 at 05:37
  • A kind of ternary contour diagram? – cblaettle Sep 16 '21 at 05:50
  • Thank you a lot! At leas this is coming close. Is it also possible to put the grid on top ? – cblaettle Sep 16 '21 at 06:33