Is there an attribute to shorten the arrow tail at the tail?

I’m reading Eugenia Cheng’s book The Joy of Abstraction - An Exploration of Math, Category Theory, and Life. On page 61 there is an interesting diagram of all the order permutations of the multiplication 2 * 3 * 5 = 30 that looks like a cube because that multiplication is commutative.

	X = [ 2, 2, 2]
	Y = [ 1, 1, 1]
	U = [-1, 0, 1]
	V = [ 1, 1, 1]
	arrows!(X,Y,U,V,
		arrowsize = 25,
		lengthscale = 0.74)

In my attempt to plot that diagram with GLMakie, there is an unwanted overlap of the arrow tails on the text. Is there some easy way to get lengthscale (or some other attribute) to shorten the arrow tail at the tail so that it doesn’t overlap the text?

Here’s the entire function to plot that diagram:

using GLMakie

function primes()

	# initialize figure
	fig = Figure(resolution = (800, 800))
	LIM = (0,5, 0,6)
	ls = 0.74 # arrow lengthscale
	vfs = 34 # vertex font size
	ax = Axis(fig[1,1], limits=LIM, aspect=1,
		title = "commutative diagram of 2*3*5=30");
	
	# commutative diagram for 2 * 3 * 5 = 30
	text!(2, 1, text = "1", 
		align = (:center, :center),
		fontsize = vfs)
	text!(4, 1, text = "0 primes",
		align = (:left, :center),
		fontsize = 20)
		
	text!([1,2,3], [2,2,2], text = ["2","3","5"], 
		align = (:center, :center),
		fontsize = vfs)
	X = [ 2, 2, 2]
	Y = [ 1, 1, 1]
	U = [-1, 0, 1]
	V = [ 1, 1, 1]
	arrows!(X,Y,U,V,
		arrowsize = 25,
		lengthscale = ls)
	text!(4, 2, text = "1 prime",
		align = (:left, :center),
		fontsize = 20)
	
	text!([1,2,3], [3,3,3], text = ["6","10","15"], 
		align = (:center, :center),
		fontsize = vfs)
	X = [1, 1, 2, 2, 3, 3]
	Y = [2, 2, 2, 2, 2, 2]
	U = [0, 1,-1, 1,-1, 0]
	V = [1, 1, 1, 1, 1, 1]
	arrows!(X,Y,U,V,
		arrowsize = 25,
		lengthscale = ls)
	text!(4, 3, text = "2 primes",
		align = (:left, :center),
		fontsize = 20)
	
	text!(2, 4, text = "30", 
		align = (:center, :center),
		fontsize = vfs)
	X = [1, 2, 3]
	Y = [3, 3, 3]
	U = [1, 0,-1]
	V = [1, 1, 1]
	arrows!(X,Y,U,V,
		arrowsize = 25,
		lengthscale = ls)
	text!(4, 4, text = "3 primes",
		align = (:left, :center),
		fontsize = 20)
	
	save("primes.png", fig)
	fig
end

1 Like

Setting the arrow color to gray helps a little as shown in the following animation that morphs between a tesseract constructed by a commutative diagram and the common perspective of a tesseract as a cube within a cube. The Julia and GLMakie code that generates this animation is in appendix A of this essay.

primes4v