更改 pgfplots 轴中的箭头大小

更改 pgfplots 轴中的箭头大小

使用选项时,我需要更改 pgfplots 的默认轴箭头大小axis lines=center。以下这个答案,我尝试了这个代码:

\documentclass{standalone}
\usepackage{pgfplots}
\usetikzlibrary{arrows, decorations.markings}

\begin{document}
\begin{tikzpicture}
\tikzstyle{myaxis} = [decoration={markings, mark=at position 1 with {\arrow[ultra thick]{latex'}}},
                      postaction={decorate}, shorten >=0.4, line width=0.02pt];
\begin{axis}[axis lines=center, axis line style={myaxis}]
\end{axis}
\end{tikzpicture}
\end{document}

但它不能像我期望的那样工作,因为轴线根本没有画出来。

你能帮我吗?谢谢,

路易吉

答案1

自定义轴线有点不直观:首先,decoration需要postaction指定之内。在使用(例如,而不是)时postactionpostaction应用于轴需要使用(类似于axis lines=leftaxis lines=middleevery path/.style如何在 PGFplots 中指定轴的名称路径)。为了避免这种情况下的无限递归,您需要postaction在第一次执行后清除。这可以使用nomorepostaction中描述的键来完成对 TikZ 中的每个路径应用后动作

这是使用以下方法生成的轴

\begin{axis}[
    axis lines=middle,
    axis line style={my axis}
]
\addplot coordinates {(-0.1,-0.2) (1.2,1.2)};
\end{axis}

完整代码如下:

\documentclass[border=5mm]{standalone}
\usepackage{pgfplots}
\usetikzlibrary{arrows, decorations.markings}

\begin{document}
\begin{tikzpicture}

\makeatletter
\tikzset{
    nomorepostaction/.code=\makeatletter\let\tikz@postactions\pgfutil@empty, % From https://tex.stackexchange.com/questions/3184/applying-a-postaction-to-every-path-in-tikz/5354#5354
    my axis/.style={
        postaction={
            decoration={
                markings,
                mark=at position 1 with {
                    \arrow[ultra thick]{latex}
                }
            },
            decorate,
            nomorepostaction
        },
        thin,
        -, % switch off other arrow tips
        every path/.append style=my axis % this is necessary so it works both with "axis lines=left" and "axis lines=middle"
    }
}
\makeatother


\begin{axis}[
    axis lines=middle,
    axis line style={my axis}
]
\addplot coordinates {(-0.1,-0.2) (1.2,1.2)};
\end{axis}
\end{tikzpicture}
\end{document}

答案2

我尝试了这个解决方案,我认为它对我来说更好。我编辑了 latex 箭头的定义,以便您可以直接指定尖端长度或使用默认值 (8pt)。因此,箭头大小现在不再依赖于线宽。显然,您可以在普通 TikZ 中使用相同的解决方案。

\documentclass{standalone}
\usepackage{pgfplots}
\pgfarrowsdeclare{mylatex'}{mylatex'}
{
  \newdimen\len
  \len=\pgfgetarrowoptions{mylatex'}
  \pgfarrowsleftextend{-0.4\len}
  \pgfarrowsrightextend{0.6\len}
}
{
  \newdimen\len
  \len=\pgfgetarrowoptions{mylatex'}
  \pgfpathmoveto{\pgfqpoint{0.6\len}{0\len}}
  \pgfpathcurveto
  {\pgfqpoint{0.35\len}{0.05\len}}
  {\pgfqpoint{-0.1\len}{0.15\len}}
  {\pgfqpoint{-0.4\len}{0.375\len}}
  \pgfpathcurveto
  {\pgfqpoint{-0.15\len}{0.1\len}}
  {\pgfqpoint{-0.15\len}{-0.1\len}}
  {\pgfqpoint{-0.4\len}{-0.375\len}}
  \pgfpathcurveto
  {\pgfqpoint{-0.1\len}{-0.15\len}}
  {\pgfqpoint{0.35\len}{-0.05\len}}
  {\pgfqpoint{0.6\len}{0\len}}
  \pgfusepathqfill
}
\pgfsetarrowoptions{mylatex'}{8pt}
\pgfkeys{/tiplen/.default=8pt, /tiplen/.code={\pgfsetarrowoptions{mylatex'}{#1}}}

\begin{document}
\begin{tikzpicture}
\begin{axis}[axis lines=left, axis line style={-mylatex'}]
\end{axis}
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}[axis lines=middle, axis line style={-mylatex', /tiplen=4pt}]
\addplot [only marks] coordinates {(0,0) (0.5,0.5)};
\draw [-mylatex', /tiplen=1cm] (axis cs: 0.1,0.1) -- (axis cs: 0.4,0.4);
\end{tikzpicture}
\end{document}

答案3

TikZ 3.0.0 或更高版本引入了 arrows.meta,允许对箭头进行大量操作。如果您愿意稍微改变箭头样式,则可以使用 arrows.meta 获得更简单的代码:

\documentclass{standalone}
\usepackage{pgfplots}
\usetikzlibrary{arrows.meta}
\begin{document}
    \begin{tikzpicture}
        \begin{axis}[axis lines=center, axis line style={-{Stealth[scale=3]}}]
        \end{axis}
    \end{tikzpicture}
\end{document}

输出结果如下:

带有较大箭头的 pgfplots 轴

注意:Stealth 是 pgfplots 中与默认轴箭头最接近的箭头,latex'。不幸的是,旧 latex' 还没有 arrows.meta 版本。Latex 也是一个不错的选择。

注 2:有关您可以操作的内容的详细信息,请参阅TikZ 手册第 16 章

相关内容