我一直在尝试根据找到的信息“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 毫米处停止装饰。这对于路径来说是可以的,但对于轴线来说则不行。这意味着某处有一个移动操作会改变电流路径这样,柱长和柱路径绘制机制就不会应用于轴线。作为示例,更改lineto
为moveto
,我们也可以在其他路径上复制该行为。
我会尝试看一下,但由于 3D/2D 设置,代码的那部分确实很复杂。也许 Christian 可以帮忙。否则我们可以开一张票。然后随机路径会自动出现箭头,无需任何post=...
调整。
事实证明,这种行为是由于内部 PGFPlots 宏中缺少扩展造成的。PGFPlots 使用修饰来放置轴不连续标记,这需要为修饰设置pre length
和值。PGFPlots使用宏(称为、等)设置和。如果没有使用不连续性,则这些宏将设置为。但是,由于某种原因,当和值包含未扩展的宏时,箭头尖端无法正确放置。因此,为了修复此行为,您可以通过在序言中放置以下代码来重新定义内部 PGFPlots 宏:post length
pre length
post length
\xdisstart
\xdisend
0pt
pre length
post 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