tikz pgf グラフを作成するときに、さまざまな要素がレンダリングされる順序を制御する方法はありますか?

tikz pgf グラフを作成するときに、さまざまな要素がレンダリングされる順序を制御する方法はありますか?

学生向けの配布資料をいくつか作成しているのですが、グラフの要素が、気が散る順序で表示されていることに気が付きました。ここに、私が言いたいことがわかるように拡大した画像があります。x=-2 の円はグラフの穴であるはずですが、線の下に表示されています。y=0 の線とグリッド自体にも同じことが当てはまります。要素が、必要な順序とはまったく逆の順序でレンダリングされているようです。 重複 グリッドがすべての下に配置され、y=0 が軸の上にあり (中央に黒い線がないため)、2 つの円がすべての上に表示されるように順序を制御する方法はありますか? このグラフのコードは次のとおりです。

\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}

答え1

レイヤーを使用する方法の1つを紹介します。レイヤーset layersに円を追加して描画しますaxis foreground

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

完全な例

\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}

ここに画像の説明を入力してください

プロットの後に円を描くこともできます。

    \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];

関連情報