How to ternary Plot3D a function

Without using any transformations, you have

$$ A = \frac13 - x - \frac{y}{\sqrt{3}}\\ B = \frac13 + x - \frac{y}{\sqrt{3}}\\ C = \frac13 + \frac{2 y}{\sqrt{3}} $$

In this form, they span the ranges $[0,1]$ over an equilateral triangle with unit edges, and satisfy $A+B+C=1$. In what follows I'll use $a$, $b$, $c$ instead of the capital letters because it's not a good idea to use capital letters for your own definitions in Mathematica.

Plotting your function, you need to multiply these with $\pi$ to get your desired range.

Here's a very simplistic way of plotting that does not generate any tick marks. It is mostly for getting a quick overview. If you want proper tick marks you need to follow some of the other recommendations, for example on question 39733. Also, MeshFunctions can give interesting meshes when combined with the effective coordinates $a$, $b$, $c$.

f[a_, b_, c_] = Sin[π*a/2] Sin[π*b/2] Sin[π*c/2];
DensityPlot[f[1/3-x-y/Sqrt[3], 1/3+x-y/Sqrt[3], 1/3+2y/Sqrt[3]],
  {x, -0.6, 0.6}, {y, -0.4, 0.7}, 
  RegionFunction -> Function[{x, y}, 0<=1/3-x-y/Sqrt[3]<=1 && 0<=1/3+x-y/Sqrt[3]<=1 && 0<=1/3+2y/Sqrt[3]<=1],
  AspectRatio -> Automatic, 
  Epilog -> {Text["A", {-1/2, -1/(2 Sqrt[3])}, {Sqrt[3]/2, 1/2}], 
             Text["B", {1/2, -1/(2 Sqrt[3])}, {-Sqrt[3]/2, 1/2}], 
             Text["C", {0, 1/Sqrt[3]}, {0, -1}]}]

enter image description here

Here is what happens if we set the function $f(a,b,c)$ to either $a$, $b$, or $c$: you can see the behavior of these coordinates,

enter image description here


It's not hard to transform the Graphics3D generated by Plot3D if you understand its structure. We already have numbers of posts about this issue so I'd like not to talk about it in this answer, you may check e.g. this post for more info. Here comes the code, notice I've made use of the new-in-v12 feature of Callout to create ticks, which is more troublesome compared to the transforming part in my opinion:

old = Pi First@Triangle[]    
begin = {##, 0} & @@@ (π AnglePath[{0, 120 °, 120 °}])
direction = Normalize /@ Differences@begin;
p3 = Plot3D[Sin[a/2] Sin[b/2] Sin[(Pi - a - b)/2], {a, b} ∈ Triangle@old];

{error, tr} = FindGeometricTransform[Most /@ Most@begin, old];

newp3 = p3 /. 
   GraphicsComplex[pts_, rest__] :>GraphicsComplex[SubsetMap[tr, #, {1, 2}] & /@ pts, rest];

ticks = ListPointPlot3D@Flatten@With[{n = 5}, 
           Table[Callout[begin[[i]] + direction[[i]] j Pi/n, j Pi/n], {i, 3}, {j, 0, n}]];

Show[newp3, ticks, Axes -> False, Boxed -> False, PlotRange -> All]

enter image description here

Hmm… the result doesn't look that great on Wolfram cloud, perhaps it'll be better on Mathematica Desktop?


DensityPlot3D[Sin[a/2] Sin[b/2] Sin[c/2],
 {a, 0, 2}, {b, 0, 2}, {c, 0, 2}]

enter image description here

Tags:

Plotting