如何在 pgfplots 中绘制具有可变线宽的图?

如何在 pgfplots 中绘制具有可变线宽的图?

我有高维数据,我想为其绘制一个线宽可变的图,有点类似于著名的米纳德图:

米纳德·拿破仑损失图表

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:与我之前对评论的回答相反,我现在意识到我真正想要的是持续地改变线宽,例如适当计算和填充的多边形。使用calcintersections我可以得到下面的结果,但我还没有设法把它放到图中(尽管关于使用宏作为坐标的问题或者这一篇是关于与 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}

相关内容