代码:
\documentclass{article}
\usepackage{pgfplots}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\usetikzlibrary{patterns}
\begin{document}
\begin{figure}[ht]
\begin{tikzpicture}
\begin{axis}[
ybar,
ymin=0,
ymax=5,
width=\linewidth,
height=3.4cm,
bar width=6pt,
ylabel style={align=center, font=\footnotesize},
ylabel={Training time\\growth rate ($N\times$)},
nodes near coords,
nodes near coords style={font=\tiny}, % Smaller font size
xticklabel style={rotate=90},
xtick=data,
table/header=false,
table/row sep=\\,
legend style={at={(0.3,1.20)}, anchor=west, legend columns=4},
label style={font=\footnotesize},
legend image code/.code={%
\draw[#1] (0cm,-0.1cm) rectangle (0.6cm,0.2cm);
},
legend image post style={scale=2},
xticklabels from table={\scriptsize
3-6~(PP)\\6-12~(PP)\\12-24~(PP)\\
3-6~(CN)\\6-12~(CN)\\12-24~(CN)\\
3-6~(PP)\\6-12~(PP)\\12-24~(PP)\\
3-6~(CN)\\6-12~(CN)\\12-24~(CN)\\
}{[index]0},
enlarge y limits={value=0.5, upper},
axis on top, % Puts the axes on top of the pattern
]
\addplot [fill=gray!80, draw=black, pattern=north west lines] table[x expr=\coordindex,y index=0]{
3.5\\3.7\\0\\3.4\\3.6\\0\\
3.8\\4.2\\0\\4.1\\4.3\\0\\
2.6\\3.2\\0\\2.5\\3.1\\0\\
};
\pgfplotsinvokeforeach{0,3,4,7,8,11}{\coordinate(l#1)at(axis cs:#1,0);}
\end{axis}
\coordinate(bbs) at (current bounding box.south);
\foreach[count=\i, evaluate={\s=int(4*\i-1)}, evaluate={\e=int(4*(\i-1))}] \text in { phase1,phase2,phase3}
\draw[decorate,decoration=brace]([xshift=4pt]l\s|-bbs)--node[below=5pt]{\text}([xshift=-4pt]l\e|-bbs);
\end{tikzpicture}
\label{Figure4-growthrate}
\end{figure}
\end{document}
输出:
在上图中,我试图覆盖第 1 阶段的前 6 个条,第 2 阶段的后 6 个条,第 3 阶段的后 6 个条。但不知何故,我无法调整花括号的尺寸。有人能帮我调整 Latex 代码中花括号的尺寸吗?
答案1
花括号的制作方法是先沿 x 轴定义命名坐标,然后相对于这些坐标绘制花括号。坐标由以下代码生成:
\pgfplotsinvokeforeach{0,3,4,7,8,11}{\coordinate(l#1)at(axis cs:#1,0);}
对于第一组中逗号分隔列表中的每个值,都会执行{}
第二组中的代码,用列表中的值(0、3 等)替换。您需要 x 值 0 和 5(在前六条之间绘制括号)、6 和 11(第二组)以及 12 和 17(第三组)处的坐标,因此请相应地修改列表,或使用,它将为您提供从 0 到 17 的所有 x 值的坐标。{}
#1
0,...,17
条形图是用循环绘制的,其中用作参考的起点和终点坐标的数字按如下方式计算:
evaluate={\s=int(4*\i-1)}, evaluate={\e=int(4*(\i-1))}
您的原始代码是为 4 个小节的组创建的。要将其修改为 6 个小节的组,请将4
表达式更改evaluate
为6
。
下面是完整代码。注意,我还添加了xticklabel style={font=\scriptsize}
设置所有刻度的字体大小的功能,而不是将其放在标签列表中,因为这样只会影响第一个刻度。
\documentclass{article}
\usepackage{pgfplots}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\usetikzlibrary{patterns}
\begin{document}
\begin{figure}[ht]
\begin{tikzpicture}
\begin{axis}[
ybar,
ymin=0,
ymax=5,
width=\linewidth,
height=3.4cm,
bar width=6pt,
ylabel style={align=center, font=\footnotesize},
ylabel={Training time\\growth rate ($N\times$)},
nodes near coords,
nodes near coords style={font=\tiny}, % Smaller font size
xticklabel style={rotate=90},
xtick=data,
table/header=false,
table/row sep=\\,
legend style={at={(0.3,1.20)}, anchor=west, legend columns=4},
label style={font=\footnotesize},
legend image code/.code={%
\draw[#1] (0cm,-0.1cm) rectangle (0.6cm,0.2cm);
},
legend image post style={scale=2},
xticklabels from table={
3-6~(PP)\\6-12~(PP)\\12-24~(PP)\\
3-6~(CN)\\6-12~(CN)\\12-24~(CN)\\
3-6~(PP)\\6-12~(PP)\\12-24~(PP)\\
3-6~(CN)\\6-12~(CN)\\12-24~(CN)\\
}{[index]0},
xticklabel style={font=\scriptsize},
enlarge y limits={value=0.5, upper},
axis on top, % Puts the axes on top of the pattern
]
\addplot [fill=gray!80, draw=black, pattern=north west lines] table[x expr=\coordindex,y index=0]{
3.5\\3.7\\0\\3.4\\3.6\\0\\
3.8\\4.2\\0\\4.1\\4.3\\0\\
2.6\\3.2\\0\\2.5\\3.1\\0\\
};
\pgfplotsinvokeforeach{0,...,17}{\coordinate(l#1)at(axis cs:#1,0);}
\end{axis}
\coordinate(bbs) at (current bounding box.south);
\foreach[count=\i, evaluate={\s=int(6*\i-1)}, evaluate={\e=int(6*(\i-1))}] \text in { phase1,phase2,phase3}
\draw[decorate,decoration=brace]([xshift=4pt]l\s|-bbs)--node[below=5pt]{\text}([xshift=-4pt]l\e|-bbs);
\end{tikzpicture}
\label{Figure4-growthrate}
\end{figure}
\end{document}