情节轴的随机装饰会弄乱轴箭头的方向

情节轴的随机装饰会弄乱轴箭头的方向

我一直在尝试根据找到的信息“xkcdifying”我想要制作的情节这里还有一些从其他来源粘贴的内容(这是我第一次使用 pgfplots)。到目前为止,一切都运行良好,直到我想给轴添加箭头。但似乎装饰random steps总是将 x 轴上的箭头向上:

在此处输入图片描述

如果注释掉下面代码中标记的行,箭头会再次正确显示,但当然漂亮的随机效果就消失了:

\documentclass{article}
\usepackage{pgfplots}

\begin{document}
\begin{tikzpicture}
\pgfplotsset{every axis/.append style={line width=1pt}}

\begin{axis}[%
  axis lines=middle,
  decoration={%
    random steps, % CRITICAL LINE
    segment length=1mm,
    amplitude=0.2pt
  }, 
  every tick/.style={thick,black,decorate},
  enlarge x limits=true,
  y tick style={draw=none},
  yticklabel=\empty,
  every inner x axis line/.append style={->},
  every inner y axis line/.append style={->},
]
\begin{scope}[decoration={random steps,segment length=3pt,amplitude=0.5pt},decorate]
\addplot [blue,samples=50, domain=0:120] {(2479*x^6)/5513508000000-(13697*x^5)/61261200000+(7935509*x^4)/220540320000-(1889983*x^3)/816816000+(2038007*x^2)/40840800+(335201*x)/1021020};
\end{scope}
\end{axis}

\end{tikzpicture}
\end{document}

现在,我猜这是一个由于随机化而导致的错误,对吗?如何修复?

答案1

我认为这是由于轴线的绘制方式造成的,在我看来这可能是一个错误。请考虑以下内容;

\documentclass{article}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}[mydeco/.style={
  decoration={%
    random steps, % CRITICAL LINE
    segment length=1mm,
    amplitude=1pt,#1,
    post length=10mm,
    post= lineto % Change to " moveto "!
  },
  decorate,
}
]
\begin{axis}[%
  line width=1pt,
  axis lines*=middle,
  every inner x axis line/.style={->,mydeco},
  every inner y axis line/.style={->,mydeco},
]
\begin{scope}[mydeco={segment length=3pt,amplitude=0.5pt},decorate]
\addplot [blue,samples=50, domain=0:120,->] {(2479*x^6)/5513508000000-(13697*x^5)/61261200000+(7935509*x^4)/220540320000-(1889983*x^3)/816816000+(2038007*x^2)/40840800+(335201*x)/1021020};
\end{scope}
\end{axis}

\draw[mydeco,->,red,ultra thick] (0,0) -- (5,6);
\end{tikzpicture}
\end{document}

在此处输入图片描述

在这里,我尝试在路径结束前 10 毫米处停止装饰。这对于路径来说是可以的,但对于轴线来说则不行。这意味着某处有一个移动操作会改变电流路径这样,柱长和柱路径绘制机制就不会应用于轴线。作为示例,更改linetomoveto,我们也可以在其他路径上复制该行为。

我会尝试看一下,但由于 3D/2D 设置,代码的那部分确实很复杂。也许 Christian 可以帮忙。否则我们可以开一张票。然后随机路径会自动出现箭头,无需任何post=...调整。


事实证明,这种行为是由于内部 PGFPlots 宏中缺少扩展造成的。PGFPlots 使用修饰来放置轴不连续标记,这需要为修饰设置pre length和值。PGFPlots使用宏(称为、等)设置和。如果没有使用不连续性,则这些宏将设置为。但是,由于某种原因,当和值包含未扩展的宏时,箭头尖端无法正确放置。因此,为了修复此行为,您可以通过在序言中放置以下代码来重新定义内部 PGFPlots 宏:post lengthpre lengthpost length\xdisstart\xdisend0ptpre lengthpost length

\makeatletter
\def\pgfplots@drawaxis@innerlines@onorientedsurf#1#2#3{%
    \if2\csname pgfplots@#1axislinesnum\endcsname
        \draw[/pgfplots/every inner #1 axis line,%
            decorate,%
            #1discont,%
            decoration={% Expand the macros before setting the values
                pre length/.expand twice=\csname #1disstart\endcsname,
                post length/.expand twice=\csname #1disend\endcsname
            }
            ]
        \pgfextra
        \csname pgfplotspointonorientedsurfaceabsetupforset#3\endcsname{\csname pgfplots@logical@ZERO@#3\endcsname}{2}%
        \pgfpathmoveto{\pgfplotspointonorientedsurfaceab{\csname pgfplots@#1min\endcsname}{\csname pgfplots@logical@ZERO@#2\endcsname}}%
        \pgfpathlineto{\pgfplotspointonorientedsurfaceab{\csname pgfplots@#1max\endcsname}{\csname pgfplots@logical@ZERO@#2\endcsname}}%
        \endpgfextra
        ;
    \fi
}%
\makeatother

相关内容