pgfplots 图例因外部化而消失

pgfplots 图例因外部化而消失

我在 pgfplot 中执行特殊图例和使用 tikz 外部化时遇到了问题。请参阅下面的 MWE。如果我使用外部化,图例将不会出现,但如果我删除外部化,图例就会出现。

关于如何在使用外部化的同时获得图例,有什么想法吗?

\documentclass{memoir}
\usepackage{pgfplots}
\usetikzlibrary{external}
\tikzexternalize[prefix=ext/]
\usepackage{subcaption}

\begin{document}
\pgfplotsset{width=\textwidth,height=6cm}
\begin{figure}[!ht]
    \centering
    \vspace{30pt}
    \begin{subfigure}[b]{0.49\textwidth}
        \centering
        \begin{tikzpicture}
            \begin{axis}[
                legend style={
                    anchor = south,
                    column sep = 0pt,
                    legend columns = 2,
                    at = {(0.9\textwidth,1.1)},
                    overlay,
                    font=\scriptsize
                }
                ]
                \addplot {x^3 - x^2};
                \addplot {x^3 +2};
                \addplot {x^2};
                \addplot {4*x+2};

                \legend{plot a, plot b, plot c, plot d};
            \end{axis}
        \end{tikzpicture}
        \caption{cap 1}
    \end{subfigure}
    \begin{subfigure}[b]{0.49\textwidth}    
        \centering
        \begin{tikzpicture}
            \begin{axis}
                \addplot {x^3 + x^2};
                \addplot {-2*x^3 -1};
                \addplot {x^2};
                \addplot {4*x+2};
            \end{axis}
        \end{tikzpicture}
        \caption{cap 2}
    \end{subfigure}
    \caption{...}
\end{figure}

\end{document}

答案1

外部 PDF 包含图例的绘制说明,但由于它被排除在边界框之外,因此被剪掉了。我相信这是 PDF 的限制(或 PDF 的边界框在 TeX 中生成的方式)。我认为它曾经适用于dvips,但我可能错了。

pdftex一种可移植的方法(即同样适用的方法)是使用legend to name并省略选项overlay。此键允许您将图例与其父轴“分离”,并使用将其放置在您喜欢的位置\ref{<the name>}

\documentclass{memoir}
\usepackage{pgfplots}
\usetikzlibrary{external}
\tikzexternalize[prefix=ext/]
\usepackage{subcaption}

\begin{document}
\pgfplotsset{width=\textwidth,height=6cm}
\begin{figure}[!ht]
    \centering
    \ref{mylegend}

    \vspace{30pt}
    \begin{subfigure}[b]{0.49\textwidth}
        \centering
        \begin{tikzpicture}
            \begin{axis}[
                legend style={
                    anchor = south,
                    column sep = 0pt,
                    legend columns = 2,
                    at = {(0.9\textwidth,1.1)},
                    font=\scriptsize
                },
                legend to name=mylegend,
                ]
                \addplot {x^3 - x^2};
                \addplot {x^3 +2};
                \addplot {x^2};
                \addplot {4*x+2};

                \legend{plot a, plot b, plot c, plot d};
            \end{axis}
        \end{tikzpicture}
        \caption{cap 1}
    \end{subfigure}
    \begin{subfigure}[b]{0.49\textwidth}    
        \centering
        \begin{tikzpicture}
            \begin{axis}
                \addplot {x^3 + x^2};
                \addplot {-2*x^3 -1};
                \addplot {x^2};
                \addplot {4*x+2};
            \end{axis}
        \end{tikzpicture}
        \caption{cap 2}
    \end{subfigure}
    \caption{...}
\end{figure}

\end{document}

在此处输入图片描述

请注意,\ref{mylegend}需要像其他一样放置\includegraphics。在本例中,我将其插入到图形的居中标题中。您可能希望根据需要采用它(以及其上方/下方的间距)。

在某种程度上,这个标签/引用内容在external库中具有内置支持。“在某种程度上”意味着你必须将\ref 手动;输出.log文件说明要在命令行中输入哪个命令。Linuxmode=list and make没有此限制;它可以自动生成所需的图形。这些有关标签/引用外部化的限制将在 PGF(或 pgfplots,以先到者为准)的下一个版本中解除。

相关内容