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}
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.
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}
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;
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}
Answered by sgmoye on January 8, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP