17

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

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]{%
   % inner radius, middle radius, outer radius, start angle,
   % 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

enter image description here

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

19

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}
\newcommand{\Radius}{3cm}
\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}
{\draw[line width=\LineWidth,\X] ({90-(\Y-1)*72}:\Radius)
 arc({90-(\Y-1)*72}:{90-(\Y)*72}:\Radius);}

\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] 
({90-(\Y-0.5)*72}:\Radius)
 arc({90-(\Y-0.5)*72}:{90-(\Y)*72-10}:\Radius);}

\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] 
  ({90-(\Y)*72}:\Radius)
 arc({90-(\Y)*72}:{90-(\Y-1)*72}:\Radius);
\else
\fill[decoration={text along path, text={|\Large\bfseries| \X},
  raise=-3pt,text color=white,text align=center},decorate] 
  ({90-(\Y-1)*72}:\Radius)
 arc({90-(\Y-1)*72}:{90-(\Y)*72}:\Radius);
\fi }

\end{tikzpicture}
\end{document}

enter image description here

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}
\newcommand{\Radius}{3cm}
\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}
{\draw[line width=\LineWidth,\X] ({90-(\Y-1)*72}:\Radius)
arc({90-(\Y-1)*72}:{90-(\Y)*72}:\Radius);}
%`,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]
({90-(\Y-0.5)*72}:\Radius)
arc({90-(\Y-0.5)*72}:{90-(\Y)*72-10}:\Radius);}

\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]
 ({90-(\Y)*72-5}:\Radius)
arc({90-(\Y)*72-5}:{90-(\Y-1)*72-5}:\Radius);
\else
\fill[decoration={text along path, text={|\Large\bfseries| \X},
 raise=-3pt,text color=white,text align=center},decorate]
 ({90-(\Y-1)*72-5}:\Radius)
arc({90-(\Y-1)*72-5}:{90-(\Y)*72-5}:\Radius);
\fi }

\end{tikzpicture}
\end{document}

enter image description here

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". ;-)

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

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}
    \newcommand*{\Radius}{3cm}
    %% 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)]
             (100:\Radius) arc (100:5:\Radius);
    }
    %% One arrowhead needs to be redrawn because it is covered
    \draw[-mytriangle,line width=\LineWidth,myyellow]
         (45:\Radius) arc (45:5:\Radius);
    %% 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}]
             (52-36:\Radius) arc(52-36:52+36:\Radius);
    }
\end{tikzpicture}

\end{document}

output with custom arrow

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}
    \newcommand*{\Radius}{3cm}
    %% 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)]
             (95:\Radius) arc (95:20:\Radius);
    }
    %% Arrowheads
    \foreach \X [count=\Y] in {myyellow,myred,myblue,mycyan,mygray} {
        \draw[-mytriangle,line width=\LineWidth,\X,rotate=72*(\Y-1)]
             (35:\Radius) arc (35:5:\Radius);
    }
    %% 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}]
             (52-36:\Radius) arc(52-36:52+36:\Radius);

    }
\end{tikzpicture}

\end{document}

output with rounded Triangle

  • 2
    +20 OK I can only give +1 ... for border=2.718281828mm, let's say ;-) – marmot Jan 13 at 4:25
  • 3
    @marmot: I suppose marmots prefer π, since it's rather more delicious :). – Circumscribe Jan 13 at 9:06
  • 3
    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. – Circumscribe Jan 13 at 11:39
  • 1
    @manooooh: Perhaps that does sound a little aggressive, and it certainly served little purpose. Apologies. – Circumscribe Jan 17 at 10:24
  • 1
    @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. – marmot Jan 17 at 15:58

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.