Note
Go to the end to download the full example code
Arrows along axes#
Arrows along the axes can be put in barycentric coordinates using transforms
for TernaryAxes in combination with FancyArrowPatch.
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import ArrowStyle, FancyArrowPatch
import mpltern # noqa: F401
ax = plt.subplot(projection='ternary')
arrowstyle = ArrowStyle('simple', head_length=10, head_width=5)
kwargs_arrow = {
'transform': ax.transAxes, # Used with ``ax.transAxesProjection``
'arrowstyle': arrowstyle,
'linewidth': 1,
'clip_on': False, # To plot arrows outside triangle
'zorder': -10, # Very low value not to hide e.g. tick labels.
}
# Start of arrows in barycentric coordinates.
ta = np.array([ 0.0, -0.1, 1.1])
la = np.array([ 1.1, 0.0, -0.1])
ra = np.array([-0.1, 1.1, 0.0])
# End of arrows in barycentric coordinates.
tb = np.array([ 1.0, -0.1, 0.1])
lb = np.array([ 0.1, 1.0, -0.1])
rb = np.array([-0.1, 0.1, 1.0])
# This transforms the above barycentric coordinates to the original Axes
# coordinates. In combination with ``ax.transAxes``, we can plot arrows fixed
# to the Axes coordinates.
f = ax.transAxesProjection.transform
tarrow = FancyArrowPatch(f(ta), f(tb), ec='C0', fc='C0', **kwargs_arrow)
larrow = FancyArrowPatch(f(la), f(lb), ec='C1', fc='C1', **kwargs_arrow)
rarrow = FancyArrowPatch(f(ra), f(rb), ec='C2', fc='C2', **kwargs_arrow)
ax.add_patch(tarrow)
ax.add_patch(larrow)
ax.add_patch(rarrow)
# To put the axis-labels at the positions consistent with the arrows above, it
# may be better to put the axis-label-text directly as follows rather than
# using e.g. ax.set_tlabel.
kwargs_label = {
'transform': ax.transTernaryAxes,
'backgroundcolor': 'w',
'ha': 'center',
'va': 'center',
'rotation_mode': 'anchor',
'zorder': -9, # A bit higher on arrows, but still lower than others.
}
# Put axis-labels on the midpoints of arrows.
tpos = (ta + tb) * 0.5
lpos = (la + lb) * 0.5
rpos = (ra + rb) * 0.5
ax.text(*tpos, 'Top' , color='C0', rotation=-60, **kwargs_label)
ax.text(*lpos, 'Left' , color='C1', rotation= 60, **kwargs_label)
ax.text(*rpos, 'Right', color='C2', rotation= 0, **kwargs_label)
plt.show()