Arrow ornaments come in two main varieties: head ornaments and fins ornaments. These are respectively placed at the end and start of a line. This vignette introduces the built-in arrow ornaments.
Head ornaments are the ‘arrowhead’ ornaments at the end of a line.
The ‘wings’ ornament places two symmetric triangles on either side of
the line, and can be called using the arrow_head_wings()
function. The offset
parameter determines at what angle the
triangle departs from the line end. The inset
parameter
determines the angle inside the corner that is not on the line. If you
ensure that inset + offset
equals 90, you can mimic
grid::arrow(..., type = "closed")
(2nd example). The
length_head
arguments determines the distance between the
red line at the arrow tip and the blue line, where the triangle re-joins
the line.
Below you can get an impression what kinds of shapes you can make with the wings arrowhead.
The ‘line’ ornament draws two line segments departing from the line
end, and can be set using the arrow_head_line()
function.
The linewidth
aesthetic determines the thickness of the
departing line, in that the line width is the same between the path and
the ornament. The size of the arrow is once again determined by the
length_head
argument, but now encompasses the length of the
protruding lines instead of the reconnection point back on the path.
The ‘minimal’ ornament isn’t truly an ornament, but determines how
the arrow shaft gets notched. Therefore, it is independent of any
length_head
you might set, and is only dependent on the
angle
argument and the linewidth
aesthetic.
I haven’t bothered writing the vignette on these other ones yet.
The ‘feather’ ornament places two trapeziums on either side of the
line, and can be called using the arrow_fins_feather()
function. Contrary to many other ornaments, the feather ornament isn’t
defined by any angle. It is instead defined by the ‘height’ of the
trapezium and the distances along the path from the inner start and end
points to the outer ones called ‘indent’ and ‘outdent’. The
length_fins
argument determines the total width of the
trapezium.
Below are some examples of what different settings look like with this ornament.
The ‘line’ fins ornament mirrors the ‘line’ head ornament: it draws
two line segments departing from the line end and can be set using the
arrow_fins_line()
function. Again the
linewidth
aesthetic determines the thickness of the
departing line, in that the line width is the same between the path and
the ornament. This size of the arrow is determined by the
length_fins
argument, but in contrast to
arrow_fins_line()
, the length_fins
argument
applies to the inner edge. Also in contrast, the angle
is
measured from the extended path to the lines, rather than from the path
itself.
Another notable difference is that in arrow_fins_line()
the most extreme parts are at the path’s end and don’t protrude beyond.
For comparison, take a look at the 5th example in
arrow_head_line()
and the first 4 examples below:
The ‘minimal’ fin ornament again isn’t truly an ornament, but it
determines how the arrow shaft gets notched. Like
arrow_head_minimal()
, arrow_fins_minimal()
doesn’t depend on any length_fins
you might set and only
depends on the angle
argument and the
linewidth
aesthetic. The only difference between
arrow_head_minimal()
and arrow_fins_minimal()
,
is what part is considered the angle
.
Not more suitable for arrow head than for fins, the ‘cup’ ornament
may fit both ends of a path. The cup shape can be specified using the
arrow_cup()
function and it follows a circular arc around
the endpoint of a path at some distance given by the resect
parameter. There are two ways these cups can be specified. The first one
is by the angle or the arc, which can be given by using the
arrow_cup(angle = ...)
function. If the angle is left as
NULL
, the ornament looks for the
length_{head/fins}
and uses that as the arc-length to draw
the arc, which is the second specification.
The cup shape can make it easier to single out some observations from the rest.
ggplot(mtcars, aes(disp, mpg)) +
geom_point(aes(colour = factor(cyl))) +
geom_arrow_curve(
data = ~ subset(.x, rownames(.x) == "Hornet 4 Drive"),
aes(xend = 300, yend = 25),
arrow_fins = arrow_cup(angle = 360), resect_fins = 1.5
) +
annotate(
"text", x = 300, y = 25,
label = "Hornet 4 Drive",
vjust = -1
)