我有高维数据,我想为其绘制一个线宽可变的图,有点类似于著名的米纳德图:
point meta
我怀疑这可以通过某种组合来实现line width={\pgfplotspointmetatransformed/1000 * 2pt}
,但我无法弄清楚如何做到这一点。对于带有标记的散点图,我找到了如何做到这一点(pgfplots
手册,版本 1.5,第 84 页),并且可以使用一维彩色网格图来改变颜色。下面的链接是一种针对箭筒图修复此问题的方法,下面我链接了一个问题,如何在“纯”中做到这一点tikz
。也许通过巧妙的装饰来实现(填充一个垂直于图的矩形?)但我认为这看起来不太好看(我还没有尝试过)。我可以填充 y-dy 和 y+dy 之间的区域,但这与改变线宽不同,因为填充的区域被估计为 ±y,而不是垂直于局部线方向。
我的数据是离散的,因此变化的线宽也可以(注意:请参阅下面的更新!)。也许可以用for
-loop 来完成。问题是:
pgfplots
如何根据特定函数改变图的线宽?
一些示例数据,我将绘制第 1 列作为第 0 列的函数,并尝试将第 2 列映射到线宽:
2006 5213 48
2007 5112 47
2008 5260 49
2009 5161 53
2010 4647 57
2011 4413 62
2012 4309 65
附加问题:如果成功的话,如果我能通过这条线画出一个非常细的网格,以便更容易看到线宽,那就太好了。甚至连米纳德都没有这样做过 :)
编辑 2012-06-01:与我之前对评论的回答相反,我现在意识到我真正想要的是持续地改变线宽,例如适当计算和填充的多边形。使用calc
和intersections
我可以得到下面的结果,但我还没有设法把它放到图中(尽管关于使用宏作为坐标的问题或者这一篇是关于与 tikz 和 pgfplots 的一致性可能会有帮助),当然我应该用我的输入数据(用pgfplotstable
)来自动化它。我喜欢用 进行几何计算calc
,但除此之外,我开始怀疑可能更容易在外部计算多边形的角,然后用 填充它们pgfplots
。另一方面,如果有一个可以插入任何数字系列的解决方案会很酷(特别是因为我的最终图将包含许多这样的线)。
\documentclass{standalone}
\usepackage{pgfplots,pgfplotstable}
\usetikzlibrary{calc}
\usetikzlibrary{intersections}
\begin{document}%
\begin{tikzpicture}
\begin{axis}
\coordinate (a) at (0, 0);
\coordinate (b) at (1, 3);
\coordinate (c) at (2, 1);
\coordinate (aba) at ($(a)!.01cm!90:(b)$);
\coordinate (abb) at ($(a)!.01cm!-90:(b)$);
\coordinate (baa) at ($(b)!.04cm!90:(a)$);
\coordinate (bab) at ($(b)!.04cm!-90:(a)$);
\coordinate (bca) at ($(b)!.04cm!90:(c)$);
\coordinate (bcb) at ($(b)!.04cm!-90:(c)$);
\coordinate (cba) at ($(c)!.1cm!90:(b)$);
\coordinate (cbb) at ($(c)!.1cm!-90:(b)$);
\coordinate (lowsect) at (intersection of abb--baa and cba--bcb);%a_1--a_2 and b_1--b_2);
\coordinate (hisect) at (intersection of aba--bab and cbb--bca);%a_1--a_2 and b_1--b_2);
\addplot[fill=black] coordinates {(abb) (lowsect) (cba) (cbb) (hisect) (aba)} -- cycle;
%\path[fill=black] (abb) -- (lowsect) -- (cba) -- (cbb) -- (hisect) -- (aba) -- cycle;
\end{axis}
\end{tikzpicture}
\end{document}
相关问题:
答案1
好吧,这是一个开始,使用一个quiver
图。这种方法要求您有一个 x 和 y 值的“差异”列。这也可以使用 即时创建pgfplotstable
,但目前,我是手动创建的。连接不是很漂亮,但我真的想不出解决办法。使用line cap=round
有点帮助,但当然会在图的开始和结束时引入伪影。
这是拿破仑的主力部队从科诺行军到莫斯科并返回(数据来自http://www.datavis.ca/gallery/re-minard.php)
这是您的样本数据的图,其中line cap=rect
。
拿破仑数据绘图代码
\documentclass{article}
\usepackage{pgfplots,pgfplotstable}
\begin{document}
\begin{tikzpicture}
\begin{axis}[
width=10cm,
height=4cm,
xlabel=Longitude,
ylabel=Latitude
]
\addplot[
quiver={
u=\thisrow{U},
v=\thisrow{V},
every arrow/.append style={
line width=1pt+\pgfplotspointmetatransformed/1000 * 9pt,
line cap=round,
color=brown!\dir!black
}
},
point meta=explicit,
visualization depends on=\thisrow{Dir}*100\as\dir
] table [meta index=2]{
X Y N U V Dir Group
24 54.9 340000 0.5 0.1 1 1
24.5 55 340000 1 -0.5 1 1
25.5 54.5 340000 0.5 0.2 1 1
26 54.7 320000 1 0.1 1 1
27 54.8 300000 1 0.1 1 1
28 54.9 280000 0.5 0.1 1 1
28.5 55 240000 0.5 0.1 1 1
29 55.1 210000 1 0.1 1 1
30 55.2 180000 0.3 0.1 1 1
30.3 55.3 175000 1.7 -0.5 1 1
32 54.8 145000 1.2 0.1 1 1
33.2 54.9 140000 1.2 0.6 1 1
34.4 55.5 127100 1.1 -0.1 1 1
35.5 55.4 100000 0.5 0.1 1 1
36 55.5 100000 1.6 0.3 1 1
37.6 55.8 100000 0.1 -0.1 1 1
37.7 55.7 100000 -0.2 0 0 1
37.5 55.7 98000 -0.5 -0.7 0 1
37 55 97000 -0.2 0 0 1
36.8 55 96000 -1.4 0.3 0 1
35.4 55.3 87000 -1.1 -0.1 0 1
34.3 55.2 55000 -1 -0.4 0 1
33.3 54.8 37000 -1.3 -0.2 0 1
32 54.6 24000 -1.6 -0.2 0 1
30.4 54.4 20000 -1.2 -0.1 0 1
29.2 54.3 20000 -0.7 -0.1 0 1
28.5 54.2 20000 -0.2 0.1 0 1
28.3 54.3 20000 -0.8 0.2 0 1
27.5 54.5 20000 -0.7 -0.2 0 1
26.8 54.3 12000 -0.4 0.1 0 1
26.4 54.4 14000 -1.4 0 0 1
25 54.4 8000 -0.6 0 0 1
24.4 54.4 4000 -0.2 0 0 1
24.2 54.4 4000 -0.1 0 0 1
};
\end{axis}
\end{tikzpicture}
\end{document}
使用 Gerrit 数据进行绘图的代码
\documentclass{article}
\usepackage{pgfplots,pgfplotstable}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\addplot[
quiver={
u=\thisrow{U},
v=\thisrow{V},
every arrow/.append style={
line width=1pt+\pgfplotspointmetatransformed/1000 * 5pt,
line cap=rect
}
},
point meta=explicit
] table [meta index=2]{
X Y N U V
2006 5213 48 1 -101
2007 5112 47 1 148
2008 5260 49 1 -99
2009 5161 53 1 -514
2010 4647 57 1 -234
2011 4413 62 1 -104
2012 4309 62 0.01 -1
};
\end{axis}
\end{tikzpicture}
\end{document}