両軸の目盛り間の pgfplot の単位を取得します (DIN 461)

両軸の目盛り間の pgfplot の単位を取得します (DIN 461)

スレッドのように pgfplot の自動生成された目盛り距離を取得します (DIN 461) すでに質問しましたが、最後の 2 つのティック間の単位を取得する方法を探しています。前述のスレッドのソリューションは、1 つの軸に対して機能します。コードを 2 つの軸に拡張しようとしましたが、これは 1 つの軸に対してのみ機能します。何が間違っているのでしょうか?

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepackage{siunitx}

\pgfplotsset{
    din xunit/.style={
        xticklabel style={
            name=xlabel\ticknum,
            append after command=\pgfextra{\xdef\lastxticknum{\ticknum}}
        },
        after end axis/.code={
            \pgfmathparse{int(\lastxticknum-1)}
            \path (xlabel\lastxticknum.base) -- (xlabel\pgfmathresult.base) node [midway, anchor=base] {#1};
        }
    },
    din yunit/.style={
        yticklabel style={
            name=ylabel\ticknum,
            append after command=\pgfextra{\xdef\lastyticknum{\ticknum}}
        },
        after end axis/.code={
            \pgfmathparse{int(\lastyticknum-1)}
            \path (ylabel\lastyticknum.base) -- (ylabel\pgfmathresult.base) node [midway, anchor=base] {#1};
        }
    }
}

\begin{document}
  \begin{tikzpicture}
    \begin{axis}[din xunit=\si{\second}, din yunit=\si{\meter}]
      \addplot table {
        0 0
        1 3
        2 4
      };
    \end{axis}
  \end{tikzpicture}
\end{document}

答え1

after end axis/.codeこれは、2 番目のものが最初のものを上書きするためです。したがって、 に変更する.code.append code問題は解決します。

% used PGFPlots v1.15
\documentclass[border=5pt]{standalone}
\usepackage{siunitx}
\usepackage{pgfplots}
    \pgfplotsset{
        compat=1.15,
        din xunit/.style={
            xticklabel style={
                name=xlabel\ticknum,
                append after command=\pgfextra{\xdef\lastxticknum{\ticknum}}
            },
            % changed `.code' to `.append code'
            after end axis/.append code={
                \pgfmathparse{int(\lastxticknum-1)}
                \path (xlabel\lastxticknum.base) -- (xlabel\pgfmathresult.base) node [midway, anchor=base] {#1};
            },
        },
        din yunit/.style={
            yticklabel style={
                name=ylabel\ticknum,
                append after command=\pgfextra{\xdef\lastyticknum{\ticknum}}
            },
            % changed `.code' to `.append code'
            after end axis/.append code={
                \pgfmathparse{int(\lastyticknum-1)}
                \path (ylabel\lastyticknum.base) -- (ylabel\pgfmathresult.base) node [midway, anchor=base] {#1};
            },
        },
    }

\begin{document}
\begin{tikzpicture}
    \begin{axis}[
        din xunit=\si{\second},
        din yunit=\si{\meter},
    ]
        \addplot table {
            0 0
            1 3
            2 4
        };
    \end{axis}
\end{tikzpicture}
\end{document}

上記コードの結果を示す画像

答え2

軸をすべて描画するためのコードも含めるとよいでしょう。

\documentclass{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=newest}
\usepackage{siunitx}

\pgfplotsset{
    din label/.style args={#1 and #2}{
        xticklabel style={
            name=xlabel\ticknum,
            append after command=\pgfextra{\xdef\xlastticknum{\ticknum}}
        },
        yticklabel style={
            name=ylabel\ticknum,
            append after command=\pgfextra{\xdef\ylastticknum{\ticknum}}
        },
        after end axis/.code={
            \pgfmathparse{int(\xlastticknum-1)}
            \path (xlabel\xlastticknum.base) -- (xlabel\pgfmathresult.base) node [midway, anchor=base] {#1};
            \pgfmathparse{int(\ylastticknum-1)}
            \path (ylabel\ylastticknum.base) -- (ylabel\pgfmathresult.base) node [midway, anchor=base] {#2};
        }
    }
}


\begin{document}
  \begin{tikzpicture}
    \begin{axis}[din label=\si{\second} and \si{\meter}]
      \addplot table {
        0 0
        1 3
        2 4
      };
    \end{axis}
  \end{tikzpicture}
\end{document}

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

関連情報