ggtern version 2.2.2 has just been submitted to CRAN, and it includes a number of new features. This time around, I have adapted the hexbin geometry (and stat), and additionally, created an almost equivalent geometry which operates on a triangular mesh rather than a hexagonal mesh. There are some subtle differences which give some added functionality, and together these will provide an additional level of richness to ternary diagrams produced with ggtern, when the data-set is perhaps significantly large and points themselves start to lose their meaning from visual clutter.
Firstly, lets look a the ternary hexbin, which, as the name suggests has the capability to bin points in a regular hexagonal grid to produce a pseudo-surface. Now in the original ggplot version, this geometry is somewhat limiting since it only performs a ‘count’ on the number of points in each bin, however, it is not hard to imagine how performing a ‘mean’ or ‘standard deviation’, or other user-defined scalar function on a mapping provided by the user:
set.seed(1) n = 5000 df = data.frame(x = runif(n), y = runif(n), z = runif(n), value = runif(n)) ggtern(df,aes(x,y,z)) + geom_hex_tern(bins=5,aes(value=value,fill=..count..))
Now because we can define user functions, we can do something a little more fancy. Here we will calculate the mean within each hexagon, and, also superimpose a text label over the top.
ggtern(df,aes(x,y,z)) + theme_bw() + geom_hex_tern(bins=5,fun=mean,aes(value=value,fill=..stat..)) + stat_hex_tern(bins=5,fun=mean, geom='text', aes(value=value,label=sprintf("%.2f",..stat..)), size=3, color='white')
The ternary tribin operates much the same, except that the binwidth no longer has meaning, instead, the density (number of panels) of the triangular mesh is controlled exclusively by the ‘bins’ argument. Using the same data above, lets create some equivalent plots:
ggtern(df,aes(x,y,z)) + geom_tri_tern(bins=5,aes(value=value,fill=..count..))
There is a subtle difference with the labelling in the stat_tri_tern usage below, we have introduced a ‘centroid’ parameter, and this is because the orientation of each polygon is not consistent (some point up, some point down) and so unlike the hexbin where the centroid is returned by default, with the construction of the polygons being handled by the geometry, for the tribin, this is all handled in the stat.
ggtern(df,aes(x,y,z)) + theme_bw() + geom_tri_tern(bins=5,fun=mean,aes(value=value,fill=..stat..)) + stat_tri_tern(bins=5,fun=mean, geom='text', aes(value=value,label=sprintf("%.2f",..stat..)), size=3, color='white',centroid=TRUE)
These new geometries have been on the cards for quite some time, several users have requested them. Many thanks Laurie and Steve from QEDInsight for partially supporting the development of this work, and forcing me to pull my finger out and get it done. Hopefully we will see these in some awesome publications this year at some time. Until this is accepted on CRAN, you will have to download from my bitbucket repo.