Eu tenho um TikHierarquia da pirâmide Z, no entanto, eu queria saber se havia uma maneira de preencher as diferentes camadas com cores. Meu código atual é:
\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}
Responder1
Você tem duas maneiras de preencher, mas na verdade existe uma maneira muito mais simples de desenhar sua pirâmide. Basicamente definimos um triângulo que recorta todos os retângulos preenchidos que posicionamos. Além de um preenchimento extra para o último elemento do seu foreach.
A primeira forma inclui uma lista de cores em um array. Adicionamos um count
ao seu foreach e o usamos para selecionar as cores. Como o array possui um índice numérico automático 0,1,2,3,...
, utilizamos a contagem para isso.
A segunda forma utiliza a contagem para desenhar uma gradação, graças à evaluate
opção de multiplicar a contagem por um determinado número. Agora, se você tiver 10 retângulos, é melhor fazer count*10
com que cada retângulo seja
color1!0!color2
color1!10!color2
color1!20!color2
color1!30!color2
E assim por diante. Mas você pode selecionar qualquer número, desde que esteja satisfeito com o resultado. Para esta última solução você também pode usar uma única cor, claro, color!##
que é a abreviação de color!##!white
que quanto maior o número, mais se mistura com o branco.
Saída
Código
\documentclass[margin=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections,backgrounds}
\begin{document}
% List of colors
\begin{tikzpicture}
\def\colorlist{{"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} {%
\pgfmathsetmacro\myfill{\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}
Responder2
Utilizando caminhos triangulares simples, podemos preencher os caminhos com cores pré-determinadas ou com gradientes em função do contador \i
do loop abaixo. x
e y
pode ser alterado para melhor aparência.
\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,Premier\\League/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}
Ou como gradientes como este:
\foreach \A/\col [count=\i,evaluate=\i as \j using 10*\i] in {Non-League, League Two,League One,Championship,Premier\\League}
\draw[fill=red!\j] (C)--([shift={(-.5*\i,1*\i)}]B)--node[above,align=center] {\A}([shift={(.5*\i,1*\i)}]A)--cycle;
Responder3
Estou muito atrasado para esta festa. Acabei de terminar um pequeno projeto com TikBiblioteca Z shapes.geometric
, então pensei em dar meus 2 centavos aqui. Nada terrivelmente complicado e sutil aqui - apenas simples TikZ. Existem comentários no código para ajudar. Experimente regular polygon sides=4
ou 5
ou 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}{\xdef\tot{\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] (T\stepnum) at (T) {};
\ifnum\stepnum=\numexpr\tot-1\relax
\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 T\stepnum.south,ptext] {\step\strut};
}%
\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}{\xdef\tot{\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] (T\stepnum) at (T) {};
\ifnum\stepnum=\numexpr\tot-1\relax
\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 T\stepnum.south,ptext] {\step\strut};
}%
\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}{\xdef\tot{\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] (T\stepnum) at (T) {};
\ifnum\stepnum=\numexpr\tot-1\relax
\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 T\stepnum.south,ptext] {\step\strut};
}%
\end{tikzpicture}%
}
%% |=====8><-----| %%
\begin{document}
\centering
\pyramid{3.0in}{Non-League/green,League Two/blue!50!white,League One/yellow,Championship/blue!70!white,Premier\\League/orange}
\bigskip
\pyramidshade{3.0in}{purple!70!red!50!white}{Non-League,League Two,League One,Championship,Premier\\League}
\bigskip
\pyramidhue{3.0in}{Non-League,League Two,League One,Championship,Premier\\League}
\end{document}