具有固定值的 xtick 数字

具有固定值的 xtick 数字

在 tikz 中使用 pgfplot 绘图时,数据可能会发生变化,因此我希望使用固定数量的 xtick 进行绘制。我知道“xtick distance”将使用固定距离的 xtick,但如果数据增加,则会绘制过多的 xticks。因此我希望使用固定数量的 xtiks,如果域增加,刻度数仍将相同。我可以使用“xtick distance”通过公式 (max - min)/N 来实现,但如果域发生变化,我需要重新计算它。

例如,如果我想要 20 xticks,我可以这样做:

\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{amsmath}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
    axis y line=middle,axis x line=middle,
    xlabel=$x$,ylabel=$\sin x$,
    xtick distance=0.6, % 20 ticks (6+6)/20
     xticklabel style={
        rotate=90,
        anchor=near xticklabel,
      }]
    \addplot[blue,mark=none]
    plot[domain=-2*pi:2*pi,samples=80] (\x,{sin(\x r)});
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述 我怎样才能自动获得这样的效果(就像“xtick number=20”)?

答案1

这里有三个新键可以帮助您:

第一个只是通过为您进行计算来减轻您的痛苦:

xtick calc distance={20}{-6}{6}

这里的参数是刻度数、x 最小值和 x 最大值。

重要的:对于接下来的两个,您必须domain=...从移动plot[...]\begin{axis}[...]。它必须在新密钥之前。没有这个,它们将无法工作。原因是:必须知道域,然后xtick distance才能计算。

另外,还可以添加domainplot[...]这将改变绘图的域。但随后您可以改用第一个键。

第二个和第三个键都以刻度数作为参数。

xtick auto distance={20}

xtick distance根据域进行计算。但这可能会导致刻度出现奇数值(在您的示例中为 0.63、1.26……)。

第三个键在计算之前对域的值进行四舍五入xtick distance

xtick auto distance={20}

在您的示例中,这导致刻度的值为 0.6、1.2、...。

代码:

编辑:稍微改进了代码

\documentclass{standalone}
\usepackage{pgfplots}
\usepackage{amsmath}

\makeatletter
% calculate xtick distance
% #1: number of ticks,
% #2: pgf math funktion to apply to domain min and max (e.g.: round)
%     may be left empty
\newcommand{\pgfplots@calc@xtick@distance}[2]{%
    \edef\@tempa{\pgfkeysvalueof{/pgfplots/domain}}%
    \expandafter\pgfplots@@calc@xtick@distance\@tempa:#1:#2\@@ppend%
    \pgfkeys{/pgfplots/xtick distance=\xtickdist}%
}

% splits value of 'domain', calculates distance (stored in '\xtickdist')
\@ifundefined{pgfplots@@calc@xtick@distance}{%
    \def\pgfplots@@calc@xtick@distance#1:#2:#3:#4\@@ppend{%
        \pgfmathsetmacro{\xtickdist}{abs(#4(#1) - #4(#2)) / #3}%
    }%
}{%
    % error message in case '\pgfplots@@calc@xtick@distance' is already defined
    \@latex@error{Command \string\pgfplots@@calc@xtick@distance\space
                  already defined.}\@eha
}

\pgfkeys{%
    % #1: number of ticks, #2: x min, #3:x max
    /pgfplots/xtick calc distance/.code n args={3}{%
        \pgfmathsetmacro{\xtickdist}{abs(#3 - #2) / #1}%
        \pgfkeys{/pgfplots/xtick distance=\xtickdist}%
    },
    % #1: number of ticks
    /pgfplots/xtick auto distance/.code={%
        \pgfplots@calc@xtick@distance{#1}{}%
    },
    % #1: number of ticks
    /pgfplots/xtick round distance/.code={%
        \pgfplots@calc@xtick@distance{#1}{round}%
    }
}
\makeatother

\begin{document}
\begin{tikzpicture}
\begin{axis}[
    axis y line=middle,axis x line=middle,
    xlabel=$x$,ylabel=$\sin x$,
    domain=-2*pi:2*pi,
    xtick round distance={20},
%    xtick auto distance={20},
%    xtick calc distance={20}{-6}{6},
%    xtick distance=0.6, % 20 ticks (6+6)/20
%    try min ticks=20,
     xticklabel style={
        rotate=90,
        anchor=near xticklabel,
      }]
    \addplot[blue,mark=none]
    plot[samples=80] (\x,{sin(\x r)});
\end{axis}
\end{tikzpicture}
\end{document}

相关内容