我正在尝试绘制大量三元图和饼图。理想情况下它应该看起来像这样:
左侧的饼图(三元图)用于解释正在发生的事情,而右侧则是带有数据的实际图表。我需要为 72 个基准绘制饼图(三元图),所以总共需要 72 个饼图和 72 个三元图。我目前使用的方法意味着大量的代码重复和手动调整。有没有更智能的组织方式?类似于 grouplots 的东西?此外,我对 pgfplots 的了解很少,因此代码需要大量完善。特别是,我不知道如何更改饼图标题中的字体大小以及如何将标题移近三元图中的图表。这是 MWE:
\documentclass{article}
\usepackage{pgfplots, pgfplotstable}
\usepgfplotslibrary{ternary, units}
\usepackage{tikz}
\begin{document}
\newcommand{\legend}[2][]{
\begin{scope}[#1]
\path
\foreach \n/\s in {#2}
{
++(0,-10pt) node[\s,legend box] {} +(5pt,0) node[legend label] {\n}
}
;
\end{scope}
}
\tikzstyle{chart}=[
legend label/.style={font={\scriptsize},anchor=west,align=left},
legend box/.style={rectangle, draw, minimum size=5pt},
axis/.style={black,semithick,->},
axis label/.style={anchor=east,font={\tiny}},
]
\tikzstyle{pie chart}=[
chart,
slice/.style={line cap=round, line join=round, very thick,draw=white},
pie title/.style={font={\bf}},
slice type/.style 2 args={
##1/.style={fill=##2},
values of ##1/.style={}
}
]
\pgfdeclarelayer{background}
\pgfdeclarelayer{foreground}
\pgfsetlayers{background,main,foreground}
\newcommand{\pie}[3][]{
\begin{scope}[#1]
\pgfmathsetmacro{\curA}{90}
\pgfmathsetmacro{\r}{1}
\def\c{(0,0)}
\node[pie title] at (90:1.3) {#2};
\foreach \v/\s in{#3}{
\pgfmathsetmacro{\deltaA}{\v/100*360}
\pgfmathsetmacro{\nextA}{\curA + \deltaA}
\pgfmathsetmacro{\midA}{(\curA+\nextA)/2}
\path[slice,\s] \c
-- +(\curA:\r)
arc (\curA:\nextA:\r)
-- cycle;
\pgfmathsetmacro{\d}{max((\deltaA * -(.4/50) + 1) , .5)}
\begin{pgfonlayer}{foreground}
\path \c -- node[pos=\d,pie values,values of \s]{$\v\%$} +(\midA:\r);
\end{pgfonlayer}
\global\let\curA\nextA
}
\end{scope}
}
\begin{figure}
\begin{minipage}{0.3\linewidth}
\begin{tikzpicture}
[
pie chart,
slice type={inlined}{lightgray},
slice type={noninlined}{darkgray},
pie values/.style={font={\tiny}},
scale=1.5
]
\pie{benchmark}{41/inlined,13/noninlined}
\legend[shift={(-1cm,-1cm)}]{{Inlined}/inlined, {Not inlined}/noninlined}
\end{tikzpicture}
\end{minipage}
\begin{minipage}{0.12\linewidth}
\begin{tikzpicture}
[
pie chart,
slice type={inlined}{lightgray},
slice type={noninlined}{darkgray},
pie values/.style={font={\tiny}},
scale=0.7
]
\pie{benchmark1}{14/inlined,43/noninlined}
\end{tikzpicture}
\end{minipage}
\begin{minipage}{0.2\linewidth}
\begin{tikzpicture}
[
pie chart,
slice type={inlined}{lightgray},
slice type={noninlined}{darkgray},
pie values/.style={font={\tiny}},
scale=0.7
]
\pie{benchmark2}{34/inlined,9/noninlined}
\end{tikzpicture}
\end{minipage}
\begin{minipage}{0.12\linewidth}
\begin{tikzpicture}
[
pie chart,
slice type={inlined}{lightgray},
slice type={noninlined}{darkgray},
pie values/.style={font={\tiny}},
scale=0.7
]
\pie{benchmark3}{14/inlined,43/noninlined}
\end{tikzpicture}
\end{minipage}
\begin{minipage}{0.12\linewidth}
\begin{tikzpicture}
[
pie chart,
slice type={inlined}{lightgray},
slice type={noninlined}{darkgray},
pie values/.style={font={\tiny}},
scale=0.7
]
\pie{benchmark4}{34/inlined,9/noninlined}
\end{tikzpicture}
\end{minipage}
\end{figure}
\begin{figure}
\begin{minipage}{0.4\linewidth}
\pgfplotsset{width=5cm}
\begin{tikzpicture}
\begin{ternaryaxis}[
xmin=0,
xmax=100,
ymin=0,
ymax=100,
zmin=0,
zmax=100,
font=\scriptsize,
xlabel=frequency,
ylabel=size,
zlabel=monomorphism,
minor tick num=3,
grid=both,
title={\textbf{benchmark}},
cycle list={{fill=darkgray, mark = triangle*},
{fill=lightgray, mark=*}},
legend cell align=left,
legend entries={Inlined, Not inlined},
legend style={mark size=2.6pt, at={(0,1)},
font=\scriptsize,
anchor=south,at={(axis description cs:0.5,-0.8)}},
mark size=2.6pt,
]
\addplot3+[only marks]
coordinates {
(20, 20, 40)
};
\addplot3+[only marks]
coordinates {
(10, 80, 10)
};
\end{ternaryaxis}
\end{tikzpicture}
\end{minipage}
\pgfplotsset{width=3.3cm}
\begin{minipage}{0.1\linewidth}
\begin{tikzpicture}
\begin{ternaryaxis}[
ticks=none,
xmin=0,
xmax=100,
ymin=0,
ymax=100,
zmin=0,
zmax=100,
mark size=2pt,
font=\tiny,
minor tick num=0,
cycle list={{fill=darkgray, mark = triangle*},
{fill=lightgray, mark=*}},
title={\bf{benchmark1}},
grid=both,
minor tick num=2,
]
\addplot3+[only marks]
coordinates {
(20, 40, 20)
};
\addplot3+[only marks]
coordinates {
(10, 10, 80)
};
\end{ternaryaxis}
\end{tikzpicture}
\end{minipage}
\pgfplotsset{width=3.3cm}
\begin{minipage}{0.1\linewidth}
\begin{tikzpicture}
\begin{ternaryaxis}[
ticks=none,
xmin=0,
xmax=100,
ymin=0,
ymax=100,
zmin=0,
zmax=100,
mark size=2pt,
font=\tiny,
minor tick num=2,
grid=both,
cycle list={{fill=darkgray, mark = triangle*},
{fill=lightgray, mark=*}},
title={\bf{benchmark2}}
]
\addplot3+[only marks]
coordinates {
(15, 45, 40)
};
\addplot3+[only marks]
coordinates {
(33, 33, 33)
};
\end{ternaryaxis}
\end{tikzpicture}
\end{minipage}
\begin{minipage}{0.1\linewidth}
\begin{tikzpicture}
\begin{ternaryaxis}[
ticks=none,
xmin=0,
xmax=100,
ymin=0,
ymax=100,
zmin=0,
zmax=100,
mark size=2pt,
font=\tiny,
minor tick num=2,
grid=both,
cycle list={{fill=darkgray, mark = triangle*},
{fill=lightgray, mark=*}},
title={\bf{benchmark3}}
]
\addplot3+[only marks]
coordinates {
(15, 45, 40)
};
\addplot3+[only marks]
coordinates {
(33, 33, 33)
};
\end{ternaryaxis}
\end{tikzpicture}
\end{minipage}
\begin{minipage}{0.1\linewidth}
\begin{tikzpicture}
\begin{ternaryaxis}[
ticks=none,
xmin=0,
xmax=100,
ymin=0,
ymax=100,
zmin=0,
zmax=100,
mark size=2pt,
font=\tiny,
minor tick num=2,
grid=both,
cycle list={{fill=darkgray, mark = triangle*},
{fill=lightgray, mark=*}},
title={\bf{benchmark4}}
]
\addplot3+[only marks]
coordinates {
(15, 45, 40)
};
\addplot3+[only marks]
coordinates {
(33, 33, 33)
};
\end{ternaryaxis}
\end{tikzpicture}
\end{minipage}
\end{figure}
\end{document}