# Reproducing a figure in tikz with text and arrows flowing round in a circle

I want to reproduce the following figure with tikz (because there is a typo in the text in this figure).

My tikz code is (borrowed from here)

\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{decorations.text}
\definecolor{mygray}{RGB}{208,208,208}
\definecolor{mymagenta}{RGB}{226,0,116}
\newcommand*{\mytextstyle}{\sffamily\Large\bfseries\color{black!85}}
\newcommand{\arcarrow}[3]{%
% end angle, tip protusion angle, options, text
\pgfmathsetmacro{\rin}{1.7}
\pgfmathsetmacro{\rmid}{2.2}
\pgfmathsetmacro{\rout}{2.7}
\pgfmathsetmacro{\astart}{#1}
\pgfmathsetmacro{\aend}{#2}
\pgfmathsetmacro{\atip}{5}
\fill[mygray, very thick] (\astart+\atip:\rin)
arc (\astart+\atip:\aend:\rin)
-- (\aend-\atip:\rmid)
-- (\aend:\rout)   arc (\aend:\astart+\atip:\rout)
-- (\astart:\rmid) -- cycle;
\path[
decoration = {
text along path,
text = {|\mytextstyle|#3},
text align = {align = center},
raise = -1.0ex
},
decorate
](\astart+\atip:\rmid) arc (\astart+\atip:\aend+\atip:\rmid);
}

\begin{document}

\begin{tikzpicture}
\fill[even odd rule, mymagenta] circle (1.5);

\node at (0,0) [
font  = \mytextstyle,
color = white,
align = center
]{
Learn\\
$6\sigma$
};

\arcarrow{ 85}{3}{Define}
\arcarrow{290}{357}{Measure}
\arcarrow{210}{289}{Analyze}
\arcarrow{206}{146}{Improve}
\arcarrow{130}{96}{Control}

\end{tikzpicture}

\end{document}


and the output is

I need hints to get my figure more close the original one. Thanks

• If you do not need the exact duplicate, have a look at the smartdiagram package: texdoc.net/texmf-dist/doc/latex/smartdiagram/smartdiagram.pdf Jan 12 '19 at 17:23
• Thank @UweZiegenhagen for pointing out a good package. I'm not looking for an exact duplicate but close to the original one. Jan 12 '19 at 17:27
• A typo? which typo do you refer to just out of curiosity? On a side note I do notice a typo in your TEX version, namely Learn should be LEAN (Lean six sigma is the name of the methodology). Jan 12 '19 at 22:29
• On TeXample Jan 13 '19 at 0:07
• possible duplicate of tex.stackexchange.com/q/118717/138900 Jan 13 '19 at 12:40

It is certainly possible to draw something of this sort. (I did not attempt to match the colors. UPDATE: corrected the orientation of the lower-most text, big thanks to manooooh!)

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{textgreek}
\usetikzlibrary{decorations.text,arrows.meta,bending}
\begin{document}
\begin{tikzpicture}
\newcommand{\LineWidth}{10mm}
\node[font=\sffamily\bfseries,scale=3.4,anchor=south] at (0,-0.1) {LEARN};
\node[font=\sffamily,scale=6,anchor=north] at (0,0.5) {6\textsigma};
\foreach \X [count=\Y] in {yellow!50!orange,gray!50,cyan!50,gray,red}

\foreach \X [count=\Y] in {yellow!50!orange,gray!50,cyan!50,gray,red}
{\draw[-{Triangle[bend,length={0.75*\LineWidth},width={1.5*\LineWidth}]},
line width=\LineWidth,\X]

\foreach \X [count=\Y] in {Define,Measure,Analyze,Improve,Control}
{\ifnum\Y=3
\fill[decoration={text along path, text={|\Large\bfseries| \X},
raise=-3pt,text color=white,text align=center},decorate]
\else
\fill[decoration={text along path, text={|\Large\bfseries| \X},
raise=-3pt,text color=white,text align=center},decorate]
\fi }

\end{tikzpicture}
\end{document}


ADDENDUM FOR FUN: I was trying to make the corners of the arrow path round. One can design arbitrary arrows with \pgfdeclarearrow, and the basis of my attempt is the example on p. 1096 of the pgfmanual. I could, however, not make \pgfsetcornersarced work. (If I would have to guess, I'd probably say that this is because the examples on pp. 1069 of the pgfmanual use \pgfusepath{stroke}, the analogon of which is \pgfusepath{fill}. However, this is not allowed in a arrow declaration, where one has to use the quick version \pgfusepathqfill, which, according to what I found, ignores \pgfsetcornersarced.) But @circumscribe has a much better solution, which I shamelessly copy here. The only minor improvement (?) is that I move the texts a bit away from the arrow heads, but full credits go to @circumscribe.

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{textgreek}
\usetikzlibrary{decorations.text,arrows.meta,bending}
\pgfdeclarearrow{
name =rtriangle,
parameters = { \the\pgfarrowlength },
setup code = {
% The different end values:
\pgfarrowssettipend{.25\pgfarrowlength}
\pgfarrowssetlineend{-.25\pgfarrowlength}
\pgfarrowssetvisualbackend{-.5\pgfarrowlength}
\pgfarrowssetbackend{-.75\pgfarrowlength}
% The hull
\pgfarrowshullpoint{.5\pgfarrowlength}{0pt}
\pgfarrowshullpoint{-.5\pgfarrowlength}{\pgfarrowlength}
\pgfarrowshullpoint{-.5\pgfarrowlength}{-\pgfarrowlength} % Saves: Only the length:
\pgfarrowssavethe\pgfarrowlength
},
drawing code = {
\pgfsetroundjoin
\pgfsetlinewidth{.2\pgflinewidth}
\pgfpathmoveto{\pgfqpoint{.5\pgfarrowlength}{0\pgfarrowlength}}
\pgfpathlineto{\pgfpoint{-.5\pgfarrowlength}{\pgfarrowlength}}
\pgfpathlineto{\pgfqpoint{-.5\pgfarrowlength}{-\pgfarrowlength}}
\pgfpathclose
\pgfusepathqfillstroke
},
defaults = { length = 4cm }
}
\begin{document}
\begin{tikzpicture}
\newcommand{\LineWidth}{10mm}
\node[font=\sffamily\bfseries,scale=3.4,anchor=south] at (0,-0.1) {LEARN};
\node[font=\sffamily,scale=6,anchor=north] at (0,0.5) {6\textsigma};
\foreach \X [count=\Y] in {yellow!50!orange,gray!50,cyan!50,gray,red}
%,width={1.5*\LineWidth}
\foreach \X [count=\Y] in {yellow!50!orange,gray!50,cyan!50,gray,red}
{\draw[-{rtriangle[bend,length={0.65*\LineWidth}]},
line width=\LineWidth,\X]

\foreach \X [count=\Y] in {Define,Measure,Analyze,Improve,Control}
{\ifnum\Y=3
\fill[decoration={text along path, text={|\Large\bfseries| \X},
raise=-3pt,text color=white,text align=center},decorate]
\else
\fill[decoration={text along path, text={|\Large\bfseries| \X},
raise=-3pt,text color=white,text align=center},decorate]
\fi }

\end{tikzpicture}
\end{document}


P.S. As for the question whether "LEAN" or "LEARN" is correct, I really don't now. However, "lean" does not sound right to marmots (a lean marmot won't survive the winter). So I kept "learn". ;-)

• It looks nice! The lower letters should be rotated by 180°, isn't it? Jan 12 '19 at 19:24
• @manooooh Gracias!
– user121799
Jan 12 '19 at 19:39
• @marmot: [Re:addendum for fun] You can use set positive line width and use \pgfsetroundjoin, like this: pastebin.com/EMuecMat Jan 12 '19 at 23:47
• @Circumscribe Oh WOW! Do you want to post this? It is certainly much more elegant than what I did.
– user121799
Jan 12 '19 at 23:50
• It's not really a new answer to the question though… Jan 12 '19 at 23:51

Here's an augmented version of marmot's answer, per his request.

The main improvement is the arrowheads, which now have rounded corners. I'm using a custom arrowhead for this because the \Triangle[round,line width=0pt .1] arrowhead is unfortunately disconnected from its shaft if the head is relatively small in comparison to the line width (as it is in this case). (And also because marmot asked for it.)

Arrowheads with rounded corners can be declared with \pgfdeclarearrow by setting a positive line width with \pgfsetlinewidth{<radius>}, calling \pgfsetroundjoin and stroking the path tracing out the arrowhead in addition to filling it with \pgfusepathqfillstroke. This can be seen in the preamble below. More information about declaring arrow tips can be found in the pgf manual (§104.4 on p1093 as of this writing, §100.4 on p1017 before 05 jan 2019), but I would also highly recommend taking a look at the source of the arrows.meta library to see some examples.

Here's the result:

\documentclass[tikz,border=2.718281828mm]{standalone}

\usepackage{textgreek}
\usetikzlibrary{decorations.text,arrows.meta,bending}

\pgfdeclarearrow{
name = mytriangle,
parameters = { \the\pgfarrowlength, \the\pgfarrowwidth, \the\pgfarrowlinewidth, \ifpgfarrowroundcap c\fi },
defaults = { length = 0pt .85, width = 0pt 1.3, line width = 0pt .1, round = true },
setup code = {
%% The different end values:
\pgfarrowssettipend{1\pgfarrowlength}
\pgfarrowssetlineend{.2\pgfarrowlength}
\pgfarrowssetvisualbackend{0\pgfarrowlength}
\pgfarrowssetbackend{0\pgfarrowwidth}
%% The hull:
\pgfarrowshullpoint{1\pgfarrowlength}{0\pgfarrowwidth}
\pgfarrowsupperhullpoint{0\pgfarrowlength}{.5\pgfarrowwidth}
%% Values that are used when drawing:
\pgfarrowssavethe\pgfarrowwidth
\pgfarrowssavethe\pgfarrowlength
\pgfarrowssavethe\pgfarrowlinewidth
},
drawing code = {
\ifpgfarrowroundcap\pgfsetroundjoin\fi
\pgfsetlinewidth{\pgfarrowlinewidth}
\pgfpathmoveto{\pgfqpoint{1\pgfarrowlength}{0\pgfarrowwidth}}
\pgfpathlineto{\pgfpoint{0\pgfarrowlength}{.5\pgfarrowwidth}}
\pgfpathlineto{\pgfqpoint{0\pgfarrowlength}{-.5\pgfarrowwidth}}
\pgfpathclose
\pgfusepathqfillstroke
},
}

\definecolor{myred}{rgb}{.92,.26,.23}
\definecolor{myyellow}{rgb}{.97,.69,.21}
\definecolor{mygray}{rgb}{.54,.53,.55}
\definecolor{mycyan}{rgb}{.38,.66,.65}
\definecolor{myblue}{rgb}{.07,.24,.32}

\begin{document}

\begin{tikzpicture}
\newcommand*{\LineWidth}{1.2cm}
%% Text:
\node[font=\sffamily\bfseries,scale=3.4,anchor=south,color=myblue] at (0,-0.1) {LEAN};
\node[font=\sffamily,scale=6,anchor=north,color=myblue] at (0,0.5) {6\textsigma};
%% Arrows:
\foreach \X [count=\Y] in {myyellow,myred,myblue,mycyan,mygray} {
\draw[-mytriangle,line width=\LineWidth,\X,rotate=72*(\Y-1)]
}
%% One arrowhead needs to be redrawn because it is covered
\draw[-mytriangle,line width=\LineWidth,myyellow]
%% Text on arrows:
\foreach \X/\reverse [count=\Y] in {De{fi}ne/true,Control/true,Improve/false,Analyze/false,Measure/false} {
\path[rotate=72*(\Y-1),decorate,decoration={text along path,text={|\Large\bfseries|\X},
raise=-2.5pt,text color=white,text align=center,reverse path=\reverse}]
}
\end{tikzpicture}

\end{document}


Note that I've used the reverse path key to flip "Define" and "Control" and am using the rotate key to rotate the arrows by multiples of 72 º instead performing these computations inside the \draw command. One arrowhead is drawn twice because they form circle and one of them will thus always be at the bottom.

Here is a version that uses the round version of the Triangle arrowhead. Because this arrowhead is partially disconnected from its shaft if it only extends a little at the sides I'm drawing the arrowheads separately from the shafts, which also fixes the overlap problem.

The result is mostly identical:

\documentclass[tikz,border=2.718281828mm]{standalone}

\usepackage{textgreek}
\usetikzlibrary{decorations.text,arrows.meta,bending}

\tikzset{mytriangle/.tip={Triangle[length = 0pt .95,width=0pt 1.45,round,line width=0pt .1]}}

\definecolor{myred}{rgb}{.92,.26,.23}
\definecolor{myyellow}{rgb}{.97,.69,.21}
\definecolor{mygray}{rgb}{.54,.53,.55}
\definecolor{mycyan}{rgb}{.38,.66,.65}
\definecolor{myblue}{rgb}{.07,.24,.32}

\begin{document}

\begin{tikzpicture}
\newcommand*{\LineWidth}{1.2cm}
%% Text:
\node[font=\sffamily\bfseries,scale=3.4,anchor=south,color=myblue] at (0,-0.1) {LEAN};
\node[font=\sffamily,scale=6,anchor=north,color=myblue] at (0,0.5) {6\textsigma};
%% Arrow shafts:
\foreach \X [count=\Y] in {myyellow,myred,myblue,mycyan,mygray} {
\draw[line width=\LineWidth,\X,rotate=72*(\Y-1)]
}
\foreach \X [count=\Y] in {myyellow,myred,myblue,mycyan,mygray} {
\draw[-mytriangle,line width=\LineWidth,\X,rotate=72*(\Y-1)]
}
%% Text on arrows:
\foreach \X/\reverse [count=\Y] in {De{fi}ne/true,Control/true,Improve/false,Analyze/false,Measure/false} {
\path[rotate=72*(\Y-1),decorate,decoration={text along path,text={|\Large\bfseries|\X},
raise=-2.5pt,text color=white,text align=center,reverse path=\reverse}]

}
\end{tikzpicture}

\end{document}


• +20 OK I can only give +1 ... for border=2.718281828mm`, let's say ;-)
– user121799
Jan 13 '19 at 4:25
• @marmot: I suppose marmots prefer π, since it's rather more delicious :). Jan 13 '19 at 9:06
• Actually π would've been more appropriate for a circumscribe like me, but you had already claimed it. Circumscribes love drawing circles around things though, so I'm content. Jan 13 '19 at 11:39
• @manooooh: Perhaps that does sound a little aggressive, and it certainly served little purpose. Apologies. Jan 17 '19 at 10:24
• @manooooh I didn't interpret it in any negative way. It is true that one could indent the code more. In the end it boils down to what editor you are using, i.e. whether it has sufficient syntax highlighting and so on.
– user121799
Jan 17 '19 at 15:58