在 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}
答案1
这里有三个新键可以帮助您:
第一个只是通过为您进行计算来减轻您的痛苦:
xtick calc distance={20}{-6}{6}
这里的参数是刻度数、x 最小值和 x 最大值。
重要的:对于接下来的两个,您必须domain=...
从移动plot[...]
到\begin{axis}[...]
。它必须在新密钥之前。没有这个,它们将无法工作。原因是:必须知道域,然后xtick distance
才能计算。
另外,还可以添加domain
,plot[...]
这将改变绘图的域。但随后您可以改用第一个键。
第二个和第三个键都以刻度数作为参数。
和
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}