I would like to draw the following using PSTricks (or TikZ):

(Found on http://i1.wp.com/mathandmultimedia.com/wp-content/uploads/2012/08/polygonal-numbers.png.)
I can do it myself using an extremely low-tech soluton where I draw every blue and yellow dot maunally, but I can't figure out how to do it' automatically'.
P.S. Sorry for not giving it a try myself; I really don't know where to start (other than the fact that is probably has to involve \multidos).
Update
I would like a representation of the triangle numbers, too.
Update 2
Consider the following code (from Qrrbrbirlbel):
\documentclass{article}
\usepackage[margin=2.4cm]{geometry}
\usepackage{tikz}
\pgfkeys{%
/handlers/.tikz/.code=\pgfkeys{\pgfkeyscurrentpath/.code=\tikzset{#1}},%
/handlers/.append tikz/.code=\pgfkeys{\pgfkeyscurrentpath/.append code=\tikzset{#1}},%
/handlers/.prefix tikz/.code=\pgfkeys{\pgfkeyscurrentpath/.prefix code=\tikzset{#1}}
}
\def\polynumset{\pgfqkeys{/polynum}}
\polynumset{
sides/.initial=4,
levels/.initial=5,
side length/.initial=+0.5cm,
%
every node/.tikz={shape=circle,draw,inner sep=+0pt,minimum size=+4pt},
center node/.tikz={fill=red},
level nodes/.tikz={fill=blue},
sublevel nodes/.tikz={fill=yellow},
%
every edge/.tikz={draw},
%
every corner edge/.code={
\ifnum\polynumcorner>1\relax
\ifnum\polynumcorner<\polynumcorners\relax
\tikzset{draw=none}
\fi
\fi
}
}
\makeatletter
\def\polynumutil@firstofone#1{\tikz@scan@next@command#1\pgf@stop}
\def\polynumutil@firstoftwo#1#2{\tikz@scan@next@command#1\pgf@stop}
\def\polynumutil@secondoftwo#1#2{\tikz@scan@next@command#2\pgf@stop}
\tikzset{
polynum/.default=,
polynum/.style={
insert path={
node[/polynum/every node/.try, /polynum/inner nodes/.try, /polynum/center node/.try] (pn@0@1@0) {}
{ [/polynum/.cd,#1]
[/utils/exec=%
\pgfmathtruncatemacro\polynumcorners{\pgfkeysvalueof{/polynum/sides}-1}%
\pgfmathtruncatemacro\polynum@levels{\pgfkeysvalueof{/polynum/levels}}%
\pgfmathsetlengthmacro\polynum@sidelength{\pgfkeysvalueof{/polynum/side length}}%
\pgfmathsetmacro\polynum@angle{360/(\the\numexpr\polynumcorners+1\relax)}%
]
\foreach \polynumcorner[evaluate={\polynum@@angle={(\polynumcorner-1)*\polynum@angle}}] in {1,...,\polynumcorners} {
% get to the next corner,
% level 1
++ (\polynum@@angle:\polynum@sidelength)
node[/polynum/every node/.try, /polynum/level nodes/.try, /polynum/level 1 nodes/.try] (pn@\polynumcorner @1@0) {}
% last level
[/utils/exec={%
\ifnum\polynumcorner=1\relax
\expandafter\polynumutil@firstoftwo
\else
\expandafter\polynumutil@secondoftwo
\fi
{+(\polynum@@angle:\the\numexpr\polynum@levels-1\relax*\polynum@sidelength)}
{ (pn@\the\numexpr\polynumcorner-1\relax @\polynum@levels @0.center)
++ (\polynum@@angle:\polynum@levels*\polynum@sidelength)}}]
% it's only a coordinate because it is used to place everything else
% including the node at the exact same position
node[shape=coordinate, alias=pn@\polynumcorner @last] (pn@\polynumcorner @\polynum@levels @0) {}
% all other levels
\foreach \polynumlevel[count=\polynum@level from 1, evaluate={\polynum@pos=\polynum@level/\the\numexpr\polynum@levels-1\relax}] in {2,...,\polynum@levels} {
(pn@\polynumcorner @1@0.center)
edge[draw=none] node[pos=\polynum@pos, /polynum/every node/.try, /polynum/level nodes/.try, style/.expanded={/polynum/level \polynumlevel\space nodes/.try}] (pn@\polynumcorner @\polynumlevel @0) {}
(pn@\polynumcorner @last.center)
% the edges between the corner nodes (blue -- blue)
(pn@\polynumcorner @\the\numexpr\polynumlevel-1\relax @0) edge[/polynum/every edge/.try, /polynum/every corner edge/.try] (pn@\polynumcorner @\polynumlevel @0)
% now the sublevels (except for the first corner because it has no previous corner)
[/utils/exec={%
\ifnum\polynumcorner>1\relax
\expandafter\polynumutil@firstofone
\else
\expandafter\pgfutil@gobble
\fi
{\foreach \polynumsublevel[evaluate={\polynum@pos=\polynumsublevel/\polynumlevel}] in {1,...,\the\numexpr\polynumlevel-1\relax}{
(pn@\the\numexpr\polynumcorner-1\relax @\polynumlevel @0.center)
edge[draw=none] node[pos=\polynum@pos, /polynum/every node/.try, /polynum/sublevel nodes/.try, style/.expanded={/polynum/sublevel \polynumsublevel\space nodes/.try}] (pn@\the\numexpr\polynumcorner-1\relax @\polynumlevel @\polynumsublevel) {}
(pn@\polynumcorner @\polynumlevel @0.center)
% the edges between sublevel nodes (blue -- yellow and yellow -- yellow)
(pn@\the\numexpr\polynumcorner-1\relax @\polynumlevel @\the\numexpr\polynumsublevel-1\relax)
edge[/polynum/every edge/.try]
(pn@\the\numexpr\polynumcorner-1\relax @\polynumlevel @\polynumsublevel)
}
% the edge between the last sublevel node and the next corner node (yellow -- blue)
(pn@\the\numexpr\polynumcorner-1\relax @\polynumlevel @\the\numexpr\polynumlevel-1\relax)
edge[/polynum/every edge/.try]
(pn@\polynumcorner @\polynumlevel @0)
}}]
}
% the edges between corner nodes (level 1, the smallest polygon: red -- blue and blue -- blue)
(pn@\the\numexpr\polynumcorner-1\relax @1@0) edge[/polynum/every edge/.try] (pn@\polynumcorner @1@0)
(pn@\polynumcorner @1@0.center)
}
% the last edge (blue -- red)
(pn@\polynumcorners @1@0) edge[/polynum/every edge/.try] (pn@0@1@0)
}
}
}
}
\makeatother
\newcommand*\polygonnumbers[1]{%
\foreach \sides in {3,...,#1}{%
\begin{tikzpicture}
\path [polynum={/tikz/rotate=360/\sides/2,sides=\sides}];
\foreach \corner in {1,...,\the\numexpr\sides-1\relax}{%
\pgfmathanglebetweenpoints{\pgfpointanchor{pn@\corner@1@0}{center}}
{\pgfpointanchor{pn@\corner@\pgfkeysvalueof{/polynum/levels}@0}{center}}
\let\angle\pgfmathresult
\draw[
blue,
rotate=\angle,
rounded corners=1pt,
thick] (pn@\corner@1@0.\angle+180) ++ (left:2pt) coordinate (@aux)
-- ++ (up:4pt)
-| ([shift=(right:2pt)] pn@\corner@\pgfkeysvalueof{/polynum/levels}@0.\angle)
|- ([shift=(down:4pt)] @aux)
-- cycle
;
}
\end{tikzpicture}
}
}
\begin{document}
\begin{figure}[htbp]
\centering
\polygonnumbers{6}
\end{figure}
\end{document}
How to I create a command where \polygonnumbers takes the two arguments #1 = <number of dots in each row> and #2 = <maximal n-gon>? (Now, I just have a command with the single argument #1 = <maximal n-gon>.)
Update 3
Unfortunately, I get an error if I change \polygonnumbers{5}{6} to \polygonnumbers{4}{6} in the following code:
\documentclass{article}
\usepackage[margin=2.4cm]{geometry}
\usepackage{tikz}
\pgfkeys{%
/handlers/.tikz/.code=\pgfkeys{\pgfkeyscurrentpath/.code=\tikzset{#1}},%
/handlers/.append tikz/.code=\pgfkeys{\pgfkeyscurrentpath/.append code=\tikzset{#1}},%
/handlers/.prefix tikz/.code=\pgfkeys{\pgfkeyscurrentpath/.prefix code=\tikzset{#1}}
}
\def\polynumset{\pgfqkeys{/polynum}}
\polynumset{
sides/.initial=4,
levels/.initial=5,
side length/.initial=+0.5cm,
%
every node/.tikz={shape=circle,draw,inner sep=+0pt,minimum size=+4pt},
center node/.tikz={fill=red},
level nodes/.tikz={fill=blue},
sublevel nodes/.tikz={fill=yellow},
%
every edge/.tikz={draw},
%
every corner edge/.code={
\ifnum\polynumcorner>1\relax
\ifnum\polynumcorner<\polynumcorners\relax
\tikzset{draw=none}
\fi
\fi
}
}
\makeatletter
\def\polynumutil@firstofone#1{\tikz@scan@next@command#1\pgf@stop}
\def\polynumutil@firstoftwo#1#2{\tikz@scan@next@command#1\pgf@stop}
\def\polynumutil@secondoftwo#1#2{\tikz@scan@next@command#2\pgf@stop}
\tikzset{
polynum/.default=,
polynum/.style={
insert path={
node[/polynum/every node/.try, /polynum/inner nodes/.try, /polynum/center node/.try] (pn@0@1@0) {}
{ [/polynum/.cd,#1]
[/utils/exec=%
\pgfmathtruncatemacro\polynumcorners{\pgfkeysvalueof{/polynum/sides}-1}%
\pgfmathtruncatemacro\polynum@levels{\pgfkeysvalueof{/polynum/levels}}%
\pgfmathsetlengthmacro\polynum@sidelength{\pgfkeysvalueof{/polynum/side length}}%
\pgfmathsetmacro\polynum@angle{360/(\the\numexpr\polynumcorners+1\relax)}%
]
\foreach \polynumcorner[evaluate={\polynum@@angle={(\polynumcorner-1)*\polynum@angle}}] in {1,...,\polynumcorners} {
% get to the next corner,
% level 1
++ (\polynum@@angle:\polynum@sidelength)
node[/polynum/every node/.try, /polynum/level nodes/.try, /polynum/level 1 nodes/.try] (pn@\polynumcorner @1@0) {}
% last level
[/utils/exec={%
\ifnum\polynumcorner=1\relax
\expandafter\polynumutil@firstoftwo
\else
\expandafter\polynumutil@secondoftwo
\fi
{+(\polynum@@angle:\the\numexpr\polynum@levels-1\relax*\polynum@sidelength)}
{ (pn@\the\numexpr\polynumcorner-1\relax @\polynum@levels @0.center)
++ (\polynum@@angle:\polynum@levels*\polynum@sidelength)}}]
% it's only a coordinate because it is used to place everything else
% including the node at the exact same position
node[shape=coordinate, alias=pn@\polynumcorner @last] (pn@\polynumcorner @\polynum@levels @0) {}
% all other levels
\foreach \polynumlevel[count=\polynum@level from 1, evaluate={\polynum@pos=\polynum@level/\the\numexpr\polynum@levels-1\relax}] in {2,...,\polynum@levels} {
(pn@\polynumcorner @1@0.center)
edge[draw=none] node[pos=\polynum@pos, /polynum/every node/.try, /polynum/level nodes/.try, style/.expanded={/polynum/level \polynumlevel\space nodes/.try}] (pn@\polynumcorner @\polynumlevel @0) {}
(pn@\polynumcorner @last.center)
% the edges between the corner nodes (blue -- blue)
(pn@\polynumcorner @\the\numexpr\polynumlevel-1\relax @0) edge[/polynum/every edge/.try, /polynum/every corner edge/.try] (pn@\polynumcorner @\polynumlevel @0)
% now the sublevels (except for the first corner because it has no previous corner)
[/utils/exec={%
\ifnum\polynumcorner>1\relax
\expandafter\polynumutil@firstofone
\else
\expandafter\pgfutil@gobble
\fi
{\foreach \polynumsublevel[evaluate={\polynum@pos=\polynumsublevel/\polynumlevel}] in {1,...,\the\numexpr\polynumlevel-1\relax}{
(pn@\the\numexpr\polynumcorner-1\relax @\polynumlevel @0.center)
edge[draw=none] node[pos=\polynum@pos, /polynum/every node/.try, /polynum/sublevel nodes/.try, style/.expanded={/polynum/sublevel \polynumsublevel\space nodes/.try}] (pn@\the\numexpr\polynumcorner-1\relax @\polynumlevel @\polynumsublevel) {}
(pn@\polynumcorner @\polynumlevel @0.center)
% the edges between sublevel nodes (blue -- yellow and yellow -- yellow)
(pn@\the\numexpr\polynumcorner-1\relax @\polynumlevel @\the\numexpr\polynumsublevel-1\relax)
edge[/polynum/every edge/.try]
(pn@\the\numexpr\polynumcorner-1\relax @\polynumlevel @\polynumsublevel)
}
% the edge between the last sublevel node and the next corner node (yellow -- blue)
(pn@\the\numexpr\polynumcorner-1\relax @\polynumlevel @\the\numexpr\polynumlevel-1\relax)
edge[/polynum/every edge/.try]
(pn@\polynumcorner @\polynumlevel @0)
}}]
}
% the edges between corner nodes (level 1, the smallest polygon: red -- blue and blue -- blue)
(pn@\the\numexpr\polynumcorner-1\relax @1@0) edge[/polynum/every edge/.try] (pn@\polynumcorner @1@0)
(pn@\polynumcorner @1@0.center)
}
% the last edge (blue -- red)
(pn@\polynumcorners @1@0) edge[/polynum/every edge/.try] (pn@0@1@0)
}
}
}
}
\makeatother
\newcommand*\polygonnumbers[2]{%
\foreach \sides in {3,...,#2}{%
\begin{tikzpicture}
\path [polynum={/tikz/rotate=360/\sides/2,levels=#1,sides=\sides}];
\foreach \corner in {1,...,\the\numexpr\sides-1\relax}{%
\pgfmathanglebetweenpoints{\pgfpointanchor{pn@\corner@1@0}{center}}
{\pgfpointanchor{pn@\corner@\pgfkeysvalueof{/polynum/levels}@0}{center}}
\let\angle\pgfmathresult
\draw[
blue,
rotate=\angle,
rounded corners=1pt,
thick] (pn@\corner@1@0.\angle+180) ++ (left:2pt) coordinate (@aux)
-- ++ (up:4pt)
-| ([shift=(right:2pt)] pn@\corner@\pgfkeysvalueof{/polynum/levels}@0.\angle)
|- ([shift=(down:4pt)] @aux)
-- cycle
;
}
\end{tikzpicture}
}
}
\begin{document}
\begin{figure}[htbp]
\centering
\polygonnumbers{4}{6}
\end{figure}
\end{document}
The error is
! Package pgf Error: No shape named pn@1@5@0 is known.
See the pgf package documentation for explanation.
Type H <return> for immediate help.
...
l.134 \polygonnumbers{4}{6}
Final
Here is what I ende up with (after another slight improvement):
\documentclass{article}
\usepackage[margin=2cm]{geometry}
\usepackage[figureposition=bottom]{caption}
\usepackage{tikz}
\DeclareCaptionLabelSeparator{tilpasning}{:\quad}
\captionsetup{%
font=small,
labelfont=sc,
labelsep=tilpasning,
width=0.7\textwidth
}
\pgfkeys{%
/handlers/.tikz/.code=\pgfkeys{\pgfkeyscurrentpath/.code=\tikzset{#1}},
/handlers/.append tikz/.code=\pgfkeys{\pgfkeyscurrentpath/.append code=\tikzset{#1}},
/handlers/.prefix tikz/.code=\pgfkeys{\pgfkeyscurrentpath/.prefix code=\tikzset{#1}}
}
\def\polynumset{\pgfqkeys{/polynum}}
\newif\ifpolynumbars
\polynumset{%
sides/.initial=4,
levels/.initial=5,
side length/.initial=+0.5cm,
x padding/.initial=+2pt,
y padding/.initial=+2pt,
bars/.is if=polynumbars,
every bar/.tikz={draw=blue, thick, rounded corners=+1pt},
%
every node/.tikz={shape=circle,draw,inner sep=+0pt,minimum size=+4pt},
center node/.tikz={fill=red},
level nodes/.tikz={fill=blue!60},
sublevel nodes/.tikz={fill=yellow},
%
every edge/.tikz={},
%
every corner edge/.code={%
\ifnum\polynumcorner>1\relax
\ifnum\polynumcorner<\polynumcorners\relax
\tikzset{draw=none}
\fi
\fi
}
}
\makeatletter
\def\polynumutil@firstofone#1{\tikz@scan@next@command#1\pgf@stop}
\def\polynumutil@firstoftwo#1#2{\tikz@scan@next@command#1\pgf@stop}
\def\polynumutil@secondoftwo#1#2{\tikz@scan@next@command#2\pgf@stop}
\polynumset{%
bar path/.style={%
to path={%
[/utils/exec=%
\pgfmathanglebetweenpoints{\pgfpointanchor{\tikztostart} {center}}
{\pgfpointanchor{\tikztotarget}{center}}
\let\polynum@a\pgfmathresult
\pgftransformrotate{\polynum@a}
\pgfpointdiff{\pgfpointanchor{\tikztostart}{center}}
{\pgfpointshapeborder{\tikztostart}{\pgfpointadd{\pgfpointanchor{\tikztostart}{center}}{\pgfpointpolar{90}{1pt}}}}
\pgfmathveclen{\pgf@x}{\pgf@y}
\edef\polynum@ydistance{\pgfmathresult pt}
\pgfcoordinate{pn@aux1}
{\pgfpointshapeborder
{\tikztostart}
{\pgfpointadd{\pgfpointanchor{\tikztostart}{center}}
{\pgfpointpolar{180}{1pt}}}}
\pgfcoordinate{pn@aux2}
{\pgfpointshapeborder
{\tikztotarget}
{\pgfpointadd{\pgfpointanchor{\tikztotarget}{center}}
{\pgfpointpolar{0}{1pt}}}}
]
([shift=(left:\pgfkeysvalueof{/polynum/x padding})]pn@aux1) coordinate (pn@aux)
-- ++ (up:\polynum@ydistance+\pgfkeysvalueof{/polynum/y padding})
-| ([shift=(right:\pgfkeysvalueof{/polynum/x padding})] pn@aux2)
|- ([shift=(down:\polynum@ydistance+\pgfkeysvalueof{/polynum/y padding})] pn@aux)
-- cycle
}
}}
\tikzset{%
polynum/.default=,
polynum/.style={%
insert path={%
node[/polynum/every node/.try, /polynum/inner nodes/.try, /polynum/center node/.try] (pn@0@1@0) {}
{ [/polynum/.cd,#1]
[/utils/exec=%
\pgfmathtruncatemacro\polynumcorners{\pgfkeysvalueof{/polynum/sides}-1}
\pgfmathtruncatemacro\polynum@levels{\pgfkeysvalueof{/polynum/levels}-1}
\pgfmathsetlengthmacro\polynum@sidelength{\pgfkeysvalueof{/polynum/side length}}
\pgfmathsetmacro\polynum@angle{360/(\the\numexpr\polynumcorners+1\relax)}
]
\foreach \polynumcorner[evaluate={\polynum@@angle={(\polynumcorner-1)*\polynum@angle}}] in {1,...,\polynumcorners} {%
% Get to the next corner;
% level 1
++ (\polynum@@angle:\polynum@sidelength)
node[/polynum/every node/.try, /polynum/level nodes/.try, /polynum/level 1 nodes/.try] (pn@\polynumcorner @1@0) {}
% last level.
[/utils/exec={%
\ifnum\polynumcorner=1\relax
\expandafter\polynumutil@firstoftwo
\else
\expandafter\polynumutil@secondoftwo
\fi
{+(\polynum@@angle:\the\numexpr\polynum@levels-1\relax*\polynum@sidelength)}
{ (pn@\the\numexpr\polynumcorner-1\relax @\polynum@levels @0.center)
++ (\polynum@@angle:\polynum@levels*\polynum@sidelength)}}]
% It is only a coordinate because it is used to place everything else,
% including the node at the exact same position.
node[shape=coordinate, alias=pn@\polynumcorner @last] (pn@\polynumcorner @\polynum@levels @0) {}
% All other levels
\foreach \polynumlevel[count=\polynum@level from 1, evaluate={\polynum@pos=\polynum@level/\the\numexpr\polynum@levels-1\relax}] in {2,...,\polynum@levels} {%
(pn@\polynumcorner @1@0.center)
edge[draw=none] node[pos=\polynum@pos, /polynum/every node/.try, /polynum/level nodes/.try, style/.expanded={/polynum/level \polynumlevel\space nodes/.try}] (pn@\polynumcorner @\polynumlevel @0) {}
(pn@\polynumcorner @last.center)
% The edges between the corner nodes (blue -- blue).
(pn@\polynumcorner @\the\numexpr\polynumlevel-1\relax @0) edge[/polynum/every edge/.try, /polynum/every corner edge/.try] (pn@\polynumcorner @\polynumlevel @0)
% Now the sublevels (except for the first corner because it has no previous corner).
[/utils/exec={%
\ifnum\polynumcorner>1\relax
\expandafter\polynumutil@firstofone
\else
\expandafter\pgfutil@gobble
\fi
{\foreach \polynumsublevel[evaluate={\polynum@pos=\polynumsublevel/\polynumlevel}] in {1,...,\the\numexpr\polynumlevel-1\relax}{%
(pn@\the\numexpr\polynumcorner-1\relax @\polynumlevel @0.center)
edge[draw=none] node[pos=\polynum@pos, /polynum/every node/.try, /polynum/sublevel nodes/.try, style/.expanded={/polynum/sublevel \polynumsublevel\space nodes/.try}] (pn@\the\numexpr\polynumcorner-1\relax @\polynumlevel @\polynumsublevel) {}
(pn@\polynumcorner @\polynumlevel @0.center)
% The edges between sublevel nodes (blue -- yellow and yellow -- yellow).
(pn@\the\numexpr\polynumcorner-1\relax @\polynumlevel @\the\numexpr\polynumsublevel-1\relax)
edge[/polynum/every edge/.try]
(pn@\the\numexpr\polynumcorner-1\relax @\polynumlevel @\polynumsublevel)
}
% The edge between the last sublevel node and the next corner node (yellow -- blue).
(pn@\the\numexpr\polynumcorner-1\relax @\polynumlevel @\the\numexpr\polynumlevel-1\relax)
edge[/polynum/every edge/.try]
(pn@\polynumcorner @\polynumlevel @0)
}}]
}
% The edges between corner nodes (level 1, the smallest polygon: red -- blue and blue -- blue).
(pn@\the\numexpr\polynumcorner-1\relax @1@0) edge[/polynum/every edge/.try] (pn@\polynumcorner @1@0)
(pn@\polynumcorner @1@0.center)
}
% The last edge (blue -- red).
(pn@\polynumcorners @1@0) edge[/polynum/every edge/.try] (pn@0@1@0)
% The bars are drawn in an extra loop to make sure they are on top.
[/utils/exec=%
\ifpolynumbars\expandafter\polynumutil@firstofone\else\expandafter\pgfutil@gobble\fi
{\foreach \polynumcorner in {1,...,\polynumcorners} {%
(pn@\polynumcorner @1@0) edge[/polynum/bar path/.try, /polynum/every bar/.try] (pn@\polynumcorner @\polynum@levels @0)}}
]
}
}
}
}
\makeatother
\polynumset{bars}
\newcommand*\polynum[4][1]{%
\foreach \sides in {#3,...,#4}{%
\begin{tikzpicture}[scale=#1,/polynum/levels=#2]
\path [/tikz/rotate=360/\sides/2,polynum={sides=\sides}];
\end{tikzpicture}
}
\caption{Illustration of the polygonal numbers~$f_{#3}(#2)$--$f_{#4}(#2)$.}
}
\pagestyle{empty}
\begin{document}
\begin{figure}[htbp]
\centering
\polynum[1.5]{5}{3}{8}
\end{figure}
\end{document}









:)Then I can also use the intuitive proof on http://mathandmultimedia.com/2012/08/01/polygonal-number-formula/ in my notes. (See also update.) – Svend Tveskæg Aug 11 '13 at 18:48{1,...,#2}in the loop and\path [polynum={/tikz/rotate=360/\sides/2,levels=#1,sides=\sides}];. Then you can do\polygonnumbers{5}{6}which creates diagrams with 3, 4, 5 and 6 corners and 5 levels which is your question’s examples including the triangles. – Qrrbrbirlbel Aug 12 '13 at 02:21:(– Svend Tveskæg Aug 12 '13 at 02:50\pgfkeysvalueof{/polynum/levels}that draws the blue bars expands to the initial value and not the set value. This can be resolved by setting/polynum/levelsas an option to thetikzpicture(instead of the path) or by implementing the bar-drawing in it. Let me update my answer in a bit which does this (if I get it to work). – Qrrbrbirlbel Aug 12 '13 at 02:57\polynumset{bars}.) – Qrrbrbirlbel Aug 12 '13 at 04:06:)– Svend Tveskæg Aug 12 '13 at 04:45