自动将 PGFPlots xtick 刻度标签放入 x 轴标签中

自动将 PGFPlots xtick 刻度标签放入 x 轴标签中

我正在尝试将xtick scale label(由 pgfkey 定义/pgfplots/xtick scale label code/.code)放在 x 轴标签中,变量名称和单位之间。

我已尝试使用输入选项xlabel = {$ x $ (\pgfkeysvalueof{/pgfplots/xtick scale label code/.code} m)}来执行,但是没有作用。

我也尝试了以下方法xtick scale label code/.code={\pgfkeyssetvalue{/pgfplots/xlabel}{#1}}强制 PGFPlots 更改我的 xlabel,但效果不佳。

我知道我可以手动完成,但我对自动方法感兴趣。有没有解决方法或解决方案?

我的 MWE 是:

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

\begin{document}

    \begin{tikzpicture}
    \begin{axis}[
        scaled x ticks=true,
        scaled y ticks = false,
        y tick label style={/pgf/number format/fixed},
        %xtick scale label code/.code={\pgfkeyssetvalue{/pgfplots/xlabel}{#1}},
        xlabel = {$ x $ (\pgfkeysvalueof{/pgfplots/xtick scale label code/.code} m)},
        ylabel = {$ y $},
    ]

    \addplot[line width=3pt] coordinates {(0.0,0.0)(100,1)(400,2)(10000,0)};

    \end{axis}
    \end{tikzpicture}

\end{document}

该代码的输出为: X 轴刻度标签应位于 x 轴标签内。

答案1

看来最好的解决办法是删除xlabel并改用xscale label。我的解决方案如下:

\documentclass{文章}
\使用包{pgfplots}
\pgfplotsset{兼容=1.14}

\开始{文档}

    \开始{tikzpicture}
    \开始{轴}[
        缩放 x 刻度=true,
        缩放 y 刻度 = false,
        y 刻度标签样式={/pgf/数字格式/固定},
        xtick 刻度标签代码/.code={$x$ $ ( 10^{#1}$ m)},
        x标签 = {},
        ylabel = {$y$},
    ]

    \addplot[线宽=3pt] 坐标 {(0.0,0.0)(100,1)(400,2)(10000,0)};

    \end{轴}
    \结束{tikzpicture}

\结束{文档}

答案2

在这里我提出了一个解决方案,主要来自 Christian Feuersänger(PGFPlots 的作者),但他允许我在这里发布它。

(记录在案:我添加了一个功能要求到 PGFPlots Tracker 来实现一个更简单的界面。)

有关解决方案如何运作的更多详细信息,请查看代码中的注释。

% used PGFPlots v1.14
\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
    \pgfplotsset{
        % use this `compat' level or higher to use the "advanced" placing of
        % the axis labels
        compat=1.3,
        % create a new style to move the `tick scale label' to the axis labels
        tick scale labels in axis labels/.code={
            \pgfkeysgetvalue{/pgfplots/xtick scale label code/.@cmd}\temp
            % remember the original value of 'xtick scale label code':
            \pgfkeyslet{/pgfplots/xtick scale label code orig/.@cmd}\temp
            %
            \pgfkeysalso{
                % simply remember the value in some global macro:
                xtick scale label code/.code={
                    \gdef\xTickScale{##1}
                },
                % now, _modify_ any user-specified value of 'xlabel' by
                % appending the tick scale label.
                % In order to evaluate this modification AFTER the user
                % wrote "xlabel={$x$}", we add it to 'every axis':
                every axis/.append style={
                    % because we don't need the "binop" in this context just
                    % set it to nothing
                    tick scale binop={},
                    xlabel/.add = {}{
                        (\pgfplotsset{xtick scale label code orig=\xTickScale}\,m)
                    },
                },
            }
        },
    }
\begin{document}
    \begin{tikzpicture}
        \begin{axis}[
            % activate/load the created style
            tick scale labels in axis labels,
            xlabel=$x$,
            ylabel=$y$,
        ]
            \addplot coordinates {
                (0.0,0.0)(100,1)(400,2)(10000,0)
            };
        \end{axis}
    \end{tikzpicture}
\end{document}

该图显示了上述代码的结果

相关内容