Existe uma maneira de controlar a ordem em que diferentes elementos são renderizados ao criar um gráfico tikz pgf?

Existe uma maneira de controlar a ordem em que diferentes elementos são renderizados ao criar um gráfico tikz pgf?

Estou criando vários folhetos para os alunos e notei que os elementos dos meus gráficos aparecem em uma ordem que pode distrair. Aqui está uma imagem ampliada onde você pode ver o que quero dizer. O círculo em x=-2 deveria ser um buraco no gráfico, mas aparece abaixo da linha. O mesmo se aplica à linha em y=0 e à própria grade. Parece que os elementos são renderizados exatamente na ordem oposta à que preciso. Sobreposição Existe uma maneira de controlar a ordem, de modo que a grade fique abaixo de tudo, y = 0 esteja acima do eixo (portanto, não haja linha preta no meio) e os dois círculos estejam acima de tudo? Meu código para este gráfico é o seguinte:

\documentclass[12pt]{extarticle}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}

\pgfplotsset{vasymptote/.style={
    before end axis/.append code={
        \draw[densely dashed, magenta] ({rel axis cs:0,0} -| {axis cs:#1,0})
        -- ({rel axis cs:0,1} -| {axis cs:#1,0});
    }
}}

\begin{document}
    \begin{tikzpicture}
      \def\FunctionF(#1){(#1+2)/((#1)^2-4)}
      \def\FunctionG(#1){0}
      \begin{axis}[
        axis y line=center,
        axis x line=middle, 
        axis on top=false,
        xmin=-6.5, xmax=6.5,
        ymin=-6.5, ymax=6.5,
        grid,
        xtick={-6,...,6},
        ytick={-6,...,6},
        yticklabels={-6,,-4,,-2,,,,2,,4,,6},
        xticklabels={-6,,-4,,-2,,,,2,,4,,6},
        vasymptote=2,
        ]

        % Hole
        \coordinate (A) at (-2,-1/4);   
        % y-intercept        
        \coordinate (B) at (0,-1/2);

        % Hole 
        \draw[magenta, thick, fill=white] (A) circle (2pt);
        % y-intercept        
        \filldraw[magenta, thick] (B) circle (2pt);

        % f(x)
        \addplot [domain=-7:2-0.1, samples=50, ultra thick, darkgray] {\FunctionF(x)};
        \addplot [domain=2+0.1:7, samples=50, ultra thick, darkgray] {\FunctionF(x)};
        \node [right, darkgray, thick] at (axis cs: 3,2) {$f(x)$};

        %g(x)
        \addplot [domain=-7:7, samples=20, ultra thick, magenta, densely dashed] {\FunctionG(x)};
      \end{axis}
    \end{tikzpicture}
\end{document}

Responder1

Aqui está uma maneira de usar camadas. Adicione set layerse desenhe os círculos na axis foregroundcamada, digamos,

\begin{pgfonlayer}{axis foreground}
    \draw[magenta, thick, fill=white] (A) circle[radius=2pt];
    % y-intercept        
    \filldraw[magenta, thick] (B) circle [radius=2pt];
\end{pgfonlayer}

Exemplo completo

\documentclass[12pt]{extarticle}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}

\pgfplotsset{vasymptote/.style={
    before end axis/.append code={
        \draw[densely dashed, magenta] ({rel axis cs:0,0} -| {axis cs:#1,0})
        -- ({rel axis cs:0,1} -| {axis cs:#1,0});
    }
}}

\begin{document}
    \begin{tikzpicture}
      \def\FunctionF(#1){(#1+2)/((#1)^2-4)}
      \def\FunctionG(#1){0}
      \begin{axis}[
        axis y line=center,
        axis x line=middle, 
        axis on top=false,
        xmin=-6.5, xmax=6.5,
        ymin=-6.5, ymax=6.5,
        grid,
        xtick={-6,...,6},
        ytick={-6,...,6},
        yticklabels={-6,,-4,,-2,,,,2,,4,,6},
        xticklabels={-6,,-4,,-2,,,,2,,4,,6},
        vasymptote=2,
        set layers%<- added
        ]

        % Hole
        \coordinate (A) at (-2,-1/4);   
        % y-intercept        
        \coordinate (B) at (0,-1/2);

        % Hole 
        \begin{pgfonlayer}{axis foreground}
        \draw[magenta, thick, fill=white] (A) circle[radius=2pt];
        % y-intercept        
        \filldraw[magenta, thick] (B) circle [radius=2pt];
        \end{pgfonlayer}

        % f(x)
        \addplot [domain=-7:2-0.1, samples=50, ultra thick, darkgray] {\FunctionF(x)};
        \addplot [domain=2+0.1:7, samples=50, ultra thick, darkgray] {\FunctionF(x)};
        \node [right, darkgray, thick] at (axis cs: 3,2) {$f(x)$};

        %g(x)
        \addplot [domain=-7:7, samples=20, ultra thick, magenta, densely dashed] {\FunctionG(x)};
      \end{axis}
    \end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

Você também pode simplesmente desenhar os círculos após os gráficos.

    \addplot [domain=-7:2-0.1, samples=50, ultra thick, darkgray] {\FunctionF(x)};
    \addplot [domain=2+0.1:7, samples=50, ultra thick, darkgray] {\FunctionF(x)};
    \node [right, darkgray, thick] at (axis cs: 3,2) {$f(x)$};

    %g(x)
    \addplot [domain=-7:7, samples=20, ultra thick, magenta, densely dashed] {\FunctionG(x)};
    % Hole 
    \draw[magenta, thick, fill=white] (A) circle[radius=2pt];
    % y-intercept        
    \filldraw[magenta, thick] (B) circle [radius=2pt];

informação relacionada