TransWikia.com

TikZ pyramid hierarchy colour

TeX - LaTeX Asked by Daniel Rawlings on January 8, 2021

I have a TikZ pyramid hierarchy, however I was wondering whether there was a way of filling the different tiers with colours. My current code is:

documentclass{article}
usepackage{tikz}
usetikzlibrary{intersections}
begin{document}

begin{tikzpicture}
coordinate (A) at (-5,0) {};
coordinate (B) at ( 5,0) {};
coordinate (C) at (0,7) {};
draw[name path=AC] (A) -- (C);
draw[name path=BC] (B) -- (C);
foreach y/A in {0/Non-League, 1.5/League Two,2.5/ League One,3.5/Championship,4.5/Premier League} {
    path[name path=horiz] (A|-0,y) -- (B|-0,y);
    draw[name intersections={of=AC and horiz,by=P},
          name intersections={of=BC and horiz,by=Q}] (P) -- (Q)
        node[midway,above] {A};
}
end{tikzpicture}
end{document}

3 Answers

You have two ways of doing the fill, but actually there is a much simpler way to draw your pyramid. We basically define a triangle that clips all the filled rectangles we position. Plus an extra fill for the last element of your foreach.

The first way includes a list of colors in an array. We add a count to your foreach and use that to select the colors. Since the array has an automatic numerical index 0,1,2,3,..., we used the count for that.

The second way instead uses the count to draw a gradation, thanks to the evaluate option, multiplying the count by a certain number. Now, if you have 10 rectangles, it's best to do count*10 so each rectangle is

color1!0!color2
color1!10!color2
color1!20!color2
color1!30!color2

And so on. But you can select any number, as long as you're happy with the result. For this last solution you can also use a single color of course, color!## which is short for color!##!white so that the higher the number, the more it's mixed with white.

Output

enter image description here

Code

documentclass[margin=10pt]{standalone}
usepackage{tikz}
usetikzlibrary{intersections,backgrounds}
begin{document}

% List of colors
begin{tikzpicture}
defcolorlist{{"cyan", "red", "orange", "yellow", "green", "gray", "blue", "violet"}}

foreach y/A [count=xi starting from 0, evaluate=y as nexty using (y+1.5, evaluate=xi as grad using int(xi*15)] in {0/Non-League, 1.5/League Two,2.5/ League One,3.5/Championship,4.5/Premier League} {%
    pgfmathsetmacromyfill{colorlist[xi]}
    begin{scope}[on background layer]
    clip[preaction={draw}] (-5,0) -- (5,0) -- (0,7) -- cycle;
    fill[myfill] (-5,y) rectangle (5,nexty);
    fill[myfill] (-5,4.5) rectangle (5,7);
    end{scope}
    node at (0,y+.3) {A};
}
end{tikzpicture}

% Gradations
begin{tikzpicture}[xshift=5cm]
foreach y/A [count=xi starting from 0, evaluate=y as nexty using (y+1.5, evaluate=xi as grad using int(xi*15)] in {0/Non-League, 1.5/League Two,2.5/ League One,3.5/Championship,4.5/Premier League} {%
    begin{scope}[on background layer]
    clip[preaction={draw}] (-5,0) -- (5,0) -- (0,7) -- cycle;
    fill[red!grad!yellow] (-5,y) rectangle (5,nexty);
    fill[red!grad!yellow] (-5,4.5) rectangle (5,7);
    end{scope}
    node at (0,y+.3) {A};
}
end{tikzpicture}
end{document}

Correct answer by Alenanno on January 8, 2021

Using simple triangle paths, we can fill the paths with predetermined colors or with gradients as a function of the counter i of the loop below. x and y can be changed for best appearance.

documentclass{article}
usepackage{tikz}
begin{document}

begin{tikzpicture}[x=2.5cm,y=2cm]
coordinate (A) at (-3,-1) {};
coordinate (B) at (3,-1) {};
coordinate (C) at (0,5) {};
foreach A/col [count=i] in {Non-League/green, League Two/cyan,League One/yellow,Championship/blue,PremierLeague/orange}
draw[fill=col] (C)--([shift={(-.5*i,1*i)}]B)--node[above,align=center] {A}([shift={(.5*i,1*i)}]A)--cycle; 
end{tikzpicture}

end{document}

enter image description here

Or as gradients like this:

foreach A/col [count=i,evaluate=i as j using 10*i] in {Non-League, League Two,League One,Championship,PremierLeague}
draw[fill=red!j] (C)--([shift={(-.5*i,1*i)}]B)--node[above,align=center] {A}([shift={(.5*i,1*i)}]A)--cycle;

enter image description here

Answered by AboAmmar on January 8, 2021

I'm very late to this party. I have just finished a little project with TikZ library shapes.geometric so thought I would give my 2¢ here. Nothing terribly complicated subtle here -- just straightforward TikZ. There are comments in the code to help. Try regular polygon sides=4 or 5 or 6.

documentclass[]{article}

usepackage[rgb]{xcolor} %% If you use pyramidhue, you will need this; TikZ does not work with hsb
usepackage{xparse}
usepackage{tikz}

usetikzlibrary{shapes.geometric,positioning}

%% |=====8><-----| %%

tikzset{tri/.style={%
        regular polygon,
        regular polygon sides=3, %% For fun, vary this number at will
        minimum size=#1,
        draw,
        thick,
        anchor=north
    },
    ptext/.style={font=bfseries,align=center,text width=0.8*pyrsize}
}

NewDocumentCommand{pyramid}{sO{}mm}{% #3 size; #4 entries
    begin{tikzpicture}
        pgfmathsetmacro{incrrate}{0.75}% The rate at which the triangles decrease in size
        coordinate (T) at (0,0);
        foreach test/testi [count=testnum from 1] in {#4}{xdeftot{testnum}}%
        pgfmathsetmacro{incr}{#3/tot}
        foreach step/col [count=stepnum from 0] in {#4}{%
            pgfmathsetlengthmacro{pyrsize}{#3-incrrate*stepnum*incr}
            node[tri=pyrsize,fill=col] (Tstepnum) at (T) {};
            ifnumstepnum=numexprtot-1relax
                pgfmathsetlengthmacro{lift}{0.0*incr*incrrate}% raise text in top shape
            else
                pgfmathsetlengthmacro{lift}{0.1*incr*incrrate}% raise text in remaining shapes
            fi
            node[above=lift of Tstepnum.south,ptext] {stepstrut};
        }%
    end{tikzpicture}%
}

NewDocumentCommand{pyramidshade}{sO{}mmm}{% #3 size; #4 base shade; #5 entries
    begin{tikzpicture}
        pgfmathsetmacro{incrrate}{0.75}% The rate at which the triangles decrease in size
        coordinate (T) at (0,0);
        foreach test [count=testnum from 1] in {#5}{xdeftot{testnum}}%
        pgfmathsetmacro{incr}{#3/tot}
        foreach step [count=stepnum from 0] in {#5}{%
            pgfmathsetlengthmacro{pyrsize}{#3-incrrate*stepnum*incr}
            pgfmathsetmacro{shade}{(tot-stepnum)/tot*100}
            node[tri=pyrsize,fill=#4!shade] (Tstepnum) at (T) {};
            ifnumstepnum=numexprtot-1relax
                pgfmathsetlengthmacro{lift}{0.1*incr*incrrate}% raise text in top shape
            else
                pgfmathsetlengthmacro{lift}{0.1*incr*incrrate}% raise text in remaining shapes
            fi
            node[above=lift of Tstepnum.south,ptext] {stepstrut};
        }%
    end{tikzpicture}%
}

NewDocumentCommand{pyramidhue}{sO{}mm}{% #3 size; #4 entries
    begin{tikzpicture}
        pgfmathsetmacro{incrrate}{0.75}% The rate at which the triangles decrease in size
        coordinate (T) at (0,0);
        foreach test [count=testnum from 1] in {#4}{xdeftot{testnum}}%
        pgfmathsetlengthmacro{incr}{#3/tot}
        foreach step [count=stepnum from 0] in {#4}{%
            pgfmathsetlengthmacro{pyrsize}{#3-incrrate*stepnum*incr}
            pgfmathsetmacro{myhue}{(tot-stepnum)/tot}%
            definecolor{mycolor}{hsb}{myhue,0.5,1}% See xcolor docs v2.12, page 18 ff.
            node[tri=pyrsize,fill=mycolor] (Tstepnum) at (T) {};
            ifnumstepnum=numexprtot-1relax
                pgfmathsetlengthmacro{lift}{0.0*incr*incrrate}% raise text in top shape
            else
                pgfmathsetlengthmacro{lift}{0.1*incr*incrrate}% raise text in remaining shapes
            fi
            node[above=lift of Tstepnum.south,ptext] {stepstrut};
        }%
    end{tikzpicture}%
}

%% |=====8><-----| %%

begin{document}

centering

pyramid{3.0in}{Non-League/green,League Two/blue!50!white,League One/yellow,Championship/blue!70!white,PremierLeague/orange}

bigskip

pyramidshade{3.0in}{purple!70!red!50!white}{Non-League,League Two,League One,Championship,PremierLeague}

bigskip

pyramidhue{3.0in}{Non-League,League Two,League One,Championship,PremierLeague}


end{document}

pyramid of shades

Answered by sgmoye on January 8, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP