在 PGF 图中标记轴的更有效方法

在 PGF 图中标记轴的更有效方法

我一直试图用每隔一个刻度标记来标记 x 轴和 y 轴,花了一段时间才搞清楚。我能够做到,但我想知道是否有更简单的方法来标记 x 轴,而不必在 xticklabels 中输入那么多逗号。代码按我希望的方式工作,只是想看看我是否可以加快一点速度。

另外,有没有更有效的方法来移动 x 和 y 轴标签(秒、英尺/秒)?我也不喜欢 cs: 命令。

感谢您的时间。

\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[thick,
    scale only axis,
    grid=major,
    axis lines=middle,
    inner axis line style={-Triangle},
    xlabel={sec},
    ylabel={feet per second},
     x label style={at={(axis description cs:1,.20)},anchor=north},
    y label style={at={(axis description cs:-.05,.5)},rotate=90,anchor=south},
    ytick={-20,-10,...,50},
    xtick={0,1,...,16},
    xticklabels={,,2,,4,,6,,8,,10,,12,,14,,16,}, %MORE EFFICIENT OR EASIER WAY????
    ymin=-20,
    ymax=50,
    xmin=-.5,
    xmax=16,
]
\addplot[color=red,ultra thick] coordinates {(0,40) (8,0) (12,-20) (16,0)};
\end{axis}
\end{tikzpicture}
\end{document}

答案1

一种方法是使用grid=both, minor x tick num=1and xtick distance=2,ytick distance=10,

\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\usetikzlibrary{arrows.meta}


\begin{document}
\begin{tikzpicture}
\begin{axis}[thick,
    axis lines=middle,
    axis line style={-Triangle},
    scale only axis,
%
    grid=both,
    minor x tick num=1,
%
    xlabel={sec},
    ylabel={feet per second},
%
    xmin=-.5,   xmax=16, xtick distance=2,
    ymin=-20,   ymax=50, ytick distance=10,
    x label style={at={(axis description cs:1,0.2)},anchor=north east, inner sep=0pt},
    y label style={at={(axis description cs:-.05,.5)},rotate=90,anchor=south},
]

\addplot[color=red,ultra thick] coordinates {(0,40) (8,0) (12,-20) (16,0)};
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

通过“cs:命令”,您可能指的是axis description cs:坐标系。

 x label style={at={(axis description cs:1,.20)},anchor=north},

很糟糕。它会根据限制改变到轴的距离 - 尝试设置ymin=-100以查看它。而且anchor=north毫无意义,因为垂直位置无论如何都是硬编码的。xticklabel cs:像这样使用

\documentclass[tikz, border=1cm]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
axis lines=middle, thick,
xmin=-.5, xmax=16,
ymin=-20, ymax=50,
xlabel={sec},
ylabel={feet per second},
x label style={at={(xticklabel cs:1)}, anchor=north},
ylabel near ticks,
y label style={anchor=center},
xtick distance=2,
minor x tick num=1,
ytick distance=10,
grid=both,
]
\addplot[red, ultra thick] coordinates {(0,40) (8,0) (12,-20) (16,0)};
\end{axis}
\end{tikzpicture}
\end{document}

带有红色绘图、网格和标签的图表

可以使用标签样式对标签位置进行xshift微调。yshift

答案3

另一种选择是tkz-base

编辑确实tkz-euclide在几何学中使用较多;这里不需要这个包。

\tkzDrawSegments[color=red,line width=1pt](A,B B,C) 

可以替换为

  • \draw[very thick,red](A)--(B)--(C); 或者
  • \draw[very thick,red] plot coordinates {(A) (B) (C)};

我们可以tikz在 中插入命令tkz-base。对于更复杂的功能,我们可以使用tkz-fct

代码

\documentclass[border=5mm]{standalone}
%https://tex.stackexchange.com/questions/673575/more-efficient-way-to-label-axes-in-pgf-plots
\usepackage{tkz-base}
%\usepackage{tkz-euclide}%<-- for \tkzDrawSegments
\begin{document}
\begin{tikzpicture}[yscale=1.2]
    \tkzInit[
        xmax=16,xstep=2,
        ymin=-20,ymax=50,ystep=10
    ]
    \tkzGrid[sub,subxstep=1,subystep=10](0,-20)(16,50)
    %\tkzAxeXY
    \tkzDrawX[left space=0.25,label = sec,below = 15pt]
    \tkzLabelX[orig=false]
    %
    \tkzDrawY[label = feet per second,midway, above=30pt,sloped]
    \tkzLabelY[orig=false]
    %
    \tkzDefPoints{0/40/A,12/-20/B,16/0/C}
    \tkzDrawPoints[color=red,size=4pt](A,B,C)
    %\tkzDrawSegments[color=red,line width=1pt](A,B B,C)
    %\draw[very thick,red](A)--(B)--(C);
    \draw[very thick,red] plot coordinates {(A) (B) (C)};
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容