У меня есть ТикZ пирамидальная иерархия, однако мне было интересно, есть ли способ заполнить разные уровни цветами. Мой текущий код:
\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}
решение1
У вас есть два способа сделать заливку, но на самом деле есть гораздо более простой способ нарисовать вашу пирамиду. Мы в основном определяем треугольник, который обрезает все заполненные прямоугольники, которые мы позиционируем. Плюс дополнительная заливка для последнего элемента вашего foreach.
Первый способ включает список цветов в массиве. Мы добавляем count
к вашему foreach и используем его для выбора цветов. Поскольку массив имеет автоматический числовой индекс 0,1,2,3,...
, мы использовали для этого count.
Второй способ вместо этого использует количество для рисования градации, благодаря опции evaluate
, умножая количество на определенное число. Теперь, если у вас есть 10 прямоугольников, лучше сделать count*10
так, чтобы каждый прямоугольник был
color1!0!color2
color1!10!color2
color1!20!color2
color1!30!color2
И так далее. Но вы можете выбрать любое число, если вы довольны результатом. Для этого последнего решения вы также можете использовать один цвет, конечно, color!##
что является сокращением от color!##!white
так, что чем выше число, тем больше он смешан с белым.
Выход
Код
\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}
решение2
Используя простые треугольные контуры, мы можем заполнить контуры предопределенными цветами или градиентами в зависимости от счетчика \i
цикла ниже. x
и y
их можно изменять для наилучшего внешнего вида.
\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}
Или в виде градиентов вроде этого:
\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;
решение3
Я очень опоздал на эту вечеринку. Я только что закончил небольшой проект с ТикБиблиотека Z, shapes.geometric
поэтому я подумал, что дам здесь свои 2 цента. Ничего здесь очень сложного и тонкого -- просто просто TiкZ. В коде есть комментарии, которые помогут. Попробуйте regular polygon sides=4
или 5
или 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}