Ich habe einen TikZ-Pyramidenhierarchie, ich habe mich jedoch gefragt, ob es eine Möglichkeit gibt, die verschiedenen Ebenen mit Farben zu füllen. Mein aktueller Code lautet:
\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}
Antwort1
Sie haben zwei Möglichkeiten, die Füllung durchzuführen, aber eigentlich gibt es eine viel einfachere Möglichkeit, Ihre Pyramide zu zeichnen. Wir definieren im Grunde ein Dreieck, das alle gefüllten Rechtecke, die wir positionieren, abschneidet. Plus eine zusätzliche Füllung für das letzte Element Ihres foreach.
Die erste Möglichkeit beinhaltet eine Liste von Farben in einem Array. Wir fügen count
Ihrem foreach ein hinzu und verwenden es, um die Farben auszuwählen. Da das Array einen automatischen numerischen Index hat 0,1,2,3,...
, haben wir dafür die Anzahl verwendet.
Die zweite Möglichkeit verwendet stattdessen die Anzahl, um eine Abstufung zu zeichnen, dank der evaluate
Option, die Anzahl mit einer bestimmten Zahl zu multiplizieren. Wenn Sie nun 10 Rechtecke haben, ist es am besten, count*10
dies zu tun, indem jedes Rechteck
color1!0!color2
color1!10!color2
color1!20!color2
color1!30!color2
Und so weiter. Sie können aber jede beliebige Zahl auswählen, solange Sie mit dem Ergebnis zufrieden sind. Für diese letzte Lösung können Sie natürlich auch eine einzelne Farbe verwenden, color!##
was eine Abkürzung dafür ist color!##!white
, dass je höher die Zahl ist, desto mehr wird sie mit Weiß gemischt.
Ausgabe
Code
\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}
Antwort2
Mithilfe einfacher Dreieckspfade können wir die Pfade mit vorgegebenen Farben oder mit Farbverläufen als Funktion des Zählers \i
der darunterliegenden Schleife füllen x
und y
für ein optimales Erscheinungsbild ändern.
\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}
Oder als Farbverläufe wie diese:
\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;
Antwort3
Ich bin sehr spät zu dieser Party gekommen. Ich habe gerade ein kleines Projekt mit Ti beendetkZ-Bibliothek, shapes.geometric
also dachte ich, ich gebe hier meine 2¢ dazu. Nichts schrecklich Kompliziertes, Subtiles hier - einfach nur geradliniges TikZ. Der Code enthält hilfreiche Kommentare. Versuchen Sie es regular polygon sides=4
mit oder 5
oder 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}