我想在绘图末尾添加虚线,以表示未来预测,而不是实际数据。我可以通过添加第二个绘图来实现这一点,如下例所示。然而,这并不好用 - 代码重复,并且不适合使用 pgfplotstableread 等提取数据。有没有办法更改绘图选定部分的线条样式?即,每个绘图的最后一段应该采用不同的样式?
\documentclass[english]{article}
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
\usepackage {tikz}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}[width=\textwidth,
ymin=0,
ymax=16,
ytick={0,4,...,16},
xmin=0,
xmax=12,
no markers,
xtick={0,4,...,12},
xticklabels={Ancient history,The past,Now,The Future}
]
\addplot+ [color=blue] coordinates
{(0,2)
(4,4)
(8,9)
};
\addplot+ [color=blue,style=dashed] coordinates
{(8,9)
(12,16)};
\end{axis}
\end{tikzpicture}
\end{document}
答案1
根据 percusse 的出色回答,这里有一个类似的方法,使用node
带有选项的pos=1,sloped
,它将在绘图末尾放置一个与绘图方向一致的节点。当键仍定义时(与 不同)current plot style
,可以通过将绘图命令放入 来使用。execute at end plot visualization
execute at end plot
此实现的缺点:您必须手动将其放在命令node [predict future nodestyle {}
末尾,因为我还没有找到让样式处理这个问题的\addplot
方法。predict future
\documentclass{article}
\usepackage{pgfplots}
\usetikzlibrary{decorations.markings,calc}
\newcommand{\predictfuture}{
}
\tikzset{
predict future/.style={
/pgfplots/execute at end plot visualization={\draw [current plot style, dashed] (@auxnode.center) -- ($(@auxnode.center)!10cm!(@auxnode.east)$);}
},
predict future nodestyle/.style={
pos=1, inner sep=0pt, sloped, alias=@auxnode
}
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[width=\textwidth,
ymin=0,
ymax=16,
ytick={0,4,...,16},
xmin=0,
xmax=12,
no markers,
xtick={0,4,...,12},
xticklabels={Ancient history,The past,Now,The Future}
]
\addplot+ [color=blue,predict future] coordinates
{(0,2)
(4,4)
(8,9)
} node [predict future nodestyle] {};
\addplot+ [domain=0:5.5,samples=50,predict future] {15-0.2*x^2+sin(2*pi*25*x)} node [predict future nodestyle] {};
\addplot+ [predict future,domain=0.1:5.5,samples=50] {2.5*ln(x)} node [predict future nodestyle] {};
\end{axis}
\end{tikzpicture}
\end{document}
答案2
这是一个几乎可行的答案。我仍在尝试找到一种方法将线条颜色、线条宽度等传递给预测线。如果您知道如何操作,请告诉我。我尝试过使用密钥,current plot style
但无法使其工作。
我应该current plot style
首先将提供给范围,并且应该使用,execute at end plot visualization
因为杰克在他的回答中巧妙地运用了一个巧妙的技巧。
\documentclass{article}
\usepackage{pgfplots}
\usetikzlibrary{decorations.markings,calc}
\tikzset{predict future/.style={
decoration={markings,
mark=at position 0.985 with {\coordinate (precoord);}
},
postaction={decorate},
/pgfplots/execute at end plot visualization={\begin{scope}[current plot style]
\draw[dashed] let \p1=(precoord),
\p2 = (current plot end),
\p3=($(\p2)-(\p1)$),
\p4=($(rel axis cs:1,1)-(rel axis cs:0,0)$),
\n3={atan2(\x3,\y3)},
\n4={veclen(\x4,\y4)}
in
(current plot end) -- ++(\n3:\n4);
\end{scope}
}
}
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[width=\textwidth,
ymin=0,
ymax=16,
ytick={0,4,...,16},
xmin=0,
xmax=12,
no markers,
xtick={0,4,...,12},
xticklabels={Ancient history,The past,Now,The Future},
]
\addplot+ [color=blue,predict future] coordinates
{(0,2)
(4,4)
(8,9)
};
\addplot+ [predict future,line width=2mm,domain=0:5.5,samples=50] {15-0.2*x^2+sin(2*pi*25*x)};
\addplot+ [predict future,double=yellow,double distance=0.5cm,domain=0.1:5.5,samples=50] {2.5*ln(x)};
\end{axis}
\end{tikzpicture}
\end{document}
基本机制是将坐标放在靠近终点的位置并获取切线角。这是可能的,因为我们可以使用和来获取上次使用的绘图的起点和终点(current plot start)
。(current plot end)
然后我们在由这些非常接近的点给出的切线获得的方向上画一条非常长的线,这样它就会偏离绘图。我又添加了两个深奥的用于测试目的的曲线。