如何调整条形图的花括号?

如何调整条形图的花括号?

代码:

\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 值的坐标。{}#10,...,17

条形图是用循环绘制的,其中用作参考的起点和终点坐标的数字按如下方式计算:

evaluate={\s=int(4*\i-1)}, evaluate={\e=int(4*(\i-1))}

您的原始代码是为 4 个小节的组创建的。要将其修改为 6 个小节的组,请将4表达式更改evaluate6

下面是完整代码。注意,我还添加了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}

相关内容