在 pgfplots 中自定义图例

在 pgfplots 中自定义图例

我正在尝试自定义该图表的图例。第一的首先,我希望图例宽度等于 x 轴宽度。目前,我通过以下方式设置图例宽度

 /tikz/every even column/.append style={column sep=1.0cm}

我可以手动调整这个值,使得长度等于 x 轴宽度,但我想有一种更优雅的方法来设置图例的宽度。

第二,我不太喜欢图例中的小彩色矩形。我只希望每个条目前面有一个矩形,而不是两个。这个矩形不需要有边框,应该与文本垂直居中。靠近文本的矩形的对齐似乎没问题,但最左边的矩形则不行。

更新:感谢 Christian Feuersänger 的评论,可以通过以下方式更改矩形

legend image code/.code={%
    \draw[#1, draw=none] (0cm,-0.1cm) rectangle (0.6cm,0.1cm);

或者 Gonzalo Medina 提出的建议

legend image code/.code={%
    \draw[#1, draw=none, /tikz/.cd, bar width=3pt, yshift=-0.2em, bar shift=0pt] %
    plot coordinates {(2*\pgfplotbarwidth,0.6em)};

第三,我希望图例条目从文本“图例:”旁边开始。

我真的不知道在满足这些要求的情况下使用图例是否仍然有意义,或者是否最好通过after end axis/.code和手动添加所有内容\ref{label}

图形

在此处输入图片描述

平均能量损失

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{document}
\begin{tikzpicture}
    \begin{axis}[
                ybar,
                height=6cm,
                title={Some plot},
                width=12cm,
                axis on top,
                y axis line style={opacity=0},
                axis x line*=bottom,
                tick align=inside,
                tick style={draw=none},
                xtick=data,
                ymajorgrids,
                major grid style={draw=white},
                xtick={1,2,3,4},
                legend style={
                    at={(0.0,-0.15)},
                    anchor=north west,
                    legend columns=-1,
                    /tikz/every even column/.append style={column sep=1.0cm}
                        },
            ]       
            \addlegendimage{empty legend}
            \addlegendentry{\textbf{Legend:}}                   
            \addplot coordinates {
                (1, 0.2064)
                (2, 0.3961)
                (3, 0.5961)
                (4, 0.7961)}; \addlegendentry[text width=45pt, text depth=]{legend a}
            \addplot coordinates {
                (1, 0.3064)
                (2, 0.4961)
                (3, 0.6961)
                (4, 0.8961)}; \addlegendentry[text width=65pt, text depth=]{lengend b}
    \end{axis} 
\end{tikzpicture}
\end{document}

答案1

关于你的第一个问题:

我如何配置图例,使其占据规定的空间量(例如图形的宽度)?

据我所知,这不可能通过 PGF 实现\matrix——而这些图例就是 PGF \matrix。正如您在问题中所考虑的那样,剩下的选择是针对\label每个图,并使用每个图手动生成图例\ref,例如使用

在此处输入图片描述

\documentclass{standalone}

\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{document}
\begin{tikzpicture}
    \def\INNERSEP{2pt}
    \def\WIDTH{12cm}
    \begin{axis}[
                ybar,
                height=6cm,
                title={Some plot},
                width=\WIDTH,
                scale only axis, % <------------
                axis on top,
                y axis line style={opacity=0},
                axis x line*=bottom,
                tick align=inside,
                tick style={draw=none},
                xtick=data,
                ymajorgrids,
                major grid style={draw=white},
                xtick={1,2,3,4},
                legend image code/.code={%
                    \draw[#1, draw=none] (0cm,-0.1cm) rectangle (0.6cm,0.1cm);
                },  
                extra description/.code={
                    \node[
                        draw,
                        text depth=0pt,
                        at={(0.0,-0.15)},
                        anchor=north west,
                        text width=\WIDTH-2*\INNERSEP,
                        inner sep=\INNERSEP,
                        outer sep=0pt,
                    ] {
                        % Some TeX/LaTeX construct which constructs
                        % the legend:
                        \hbox to \linewidth{%
                            \textbf{Legend:} 
                            \ref{A} Legend a \hfill \ref{B} Legend b \hfill
                        }%
                    };
                },
            ]       
            \addplot coordinates {
                (1, 0.2064)
                (2, 0.3961)
                (3, 0.5961)
                (4, 0.7961)};
                \label{A}
            \addplot coordinates {
                (1, 0.3064)
                (2, 0.4961)
                (3, 0.6961)
                (4, 0.8961)};
                \label{B}
    \end{axis} 
\end{tikzpicture}
\end{document}

关于你的第二个问题:

我如何重新配置​​每个图的小图像的外观?

正如一些评论指出的那样,图例中显示的小图像可以使用 重新配置legend image code。小条的合适替代品可能是使用一些矩形(如您的编辑中所示)。

在此处输入图片描述

\documentclass{standalone}

\usepackage{pgfplots}
\pgfplotsset{compat=newest}

\begin{document}
\begin{tikzpicture}
    \begin{axis}[
                ybar,
                height=6cm,
                title={Some plot},
                width=12cm,
                axis on top,
                y axis line style={opacity=0},
                axis x line*=bottom,
                tick align=inside,
                tick style={draw=none},
                xtick=data,
                ymajorgrids,
                major grid style={draw=white},
                xtick={1,2,3,4},
                legend image code/.code={%
                    \draw[#1, draw=none] (0cm,-0.1cm) rectangle (0.6cm,0.1cm);
                },  
                legend style={
                    draw=none, % ?
                    text depth=0pt,
                    at={(0.0,-0.15)},
                    anchor=north west,
                    legend columns=-1,
                    % default spacing:
                    column sep=1cm,
                    % The text "Legend:"
                    /tikz/column 2/.style={column sep=0pt,font=\bfseries},
                    %
                    % the space between legend image and text:
                    /tikz/every odd column/.append style={column sep=0cm},
                },
            ]       
            \addlegendimage{empty legend}
            \addlegendentry{\textbf{Legend:}}                   
            \addplot coordinates {
                (1, 0.2064)
                (2, 0.3961)
                (3, 0.5961)
                (4, 0.7961)}; \addlegendentry{legend a}
            \addplot coordinates {
                (1, 0.3064)
                (2, 0.4961)
                (3, 0.6961)
                (4, 0.8961)}; \addlegendentry{lengend b}
    \end{axis} 
\end{tikzpicture}
\end{document}

关于第三个问题:

我如何重新配置​​图例,使其从文本“图例:”旁边开始?

如果您配置了,则可以分发column sep这样的东西,使其不适用于您的第一个人造图例条目/tikz/column 2/.style。我在上面的例子中就是这么做的。

draw=none您会注意到,由于缺乏对您的第一个问题的支持,我还添加了内容。

相关内容