按照列表中的点顺序绘制颜色图 - Mathematica

时间:2011-08-19 21:40:52

标签: plot wolfram-mathematica

我有一个按时间排序的三维点列表。有没有办法绘制点,以便我可以获得一个视觉表示,其中还包括列表中出现点的位置的信息?我最初的想法是找到一种方法,按照绘制顺序对点进行着色。

ListPlot3D在点上覆盖一张纸,不考虑它们的绘制顺序。

ListPointPlot只显示这些点,但没有说明它们的绘制顺序。在这里,我正在考虑根据它们在列表中出现的顺序对点进行着色。

与许多其他绘图功能不同,

ListLinePlot似乎没有3D表兄弟。

5 个答案:

答案 0 :(得分:12)

您也可以执行类似

的操作
lst = RandomReal[{0, 3}, {20, 3}];
Graphics3D[{Thickness[0.005], 
  Line[lst, 
   VertexColors -> 
    Table[ColorData["BlueGreenYellow"][i], {i, 
      Rescale[Range[Length[lst]]]}]]}]

line with gradient

答案 1 :(得分:5)

由于你没有提供例子,我通过创建一个3d自我避免随机游走来构建一些:

Clear[saRW3d]
saRW3d[steps_]:=
    Module[{visited},
        visited[_]=False;
        NestList[
            (Function[{randMove},
                If[
                    visited[#+randMove]==False,
                    visited[#+randMove]=True;
                    #+randMove,
                    #
                ]
            ][RandomChoice[{{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}}]])&,
            {0,0,0},
            steps
        ]//DeleteDuplicates
]

(这是一种有缺陷的但是可以完成工作;它会在3d中产生随机游走,避免自身,即避免在后续步骤中重新访问相同的位置。)

然后我们生成100000个这样的步骤

dat = saRW3d[100000];

这就像我理解你的数据点一样。然后,我们将这些更改颜色取决于它的步骤:

datpairs = Partition[dat, 2, 1];
len = Length@datpairs;
dressPoints[pts_, lspec_] := {RGBColor[(N@First@lspec)/len, 0, 0], 
   Line@pts};
datplt = MapIndexed[dressPoints, datpairs];

这也可以像其他答案一样一次完成

datplt=MapIndexed[
    {RGBColor[(N@First@#2)/Length@dat, 0, 0], Line@#1} &,
    Partition[dat, 2, 1]
]

但我倾向于避免这种结构,因为我发现它们更难以阅读和修改。

最后绘制结果:

Graphics3D[datplt]

enter image description here

随着时间的推移,路径变得越来越红。

如果这是你所追求的事情,我可以详细说明。

编辑:可能有更简单的方法来做到这一点......

EDIT2:显示一大组要点,以证明在arrows无法轻易扩展的情况下,查看定性趋势非常有用。

EDIT3:添加了单行版本。

答案 2 :(得分:4)

我认为Heike的方法是最好的,但她让它变得过于复杂,恕我直言。我会用:

Graphics3D[{
  Thickness[0.005], 
  Line[lst, 
   VertexColors -> 
    ColorData["SolarColors"] /@ Rescale@Range@Length@lst ]
}]

enter image description here

(acl的数据)

答案 3 :(得分:2)

Graphics3D@(Arrow /@ Partition[RandomInteger[{0, 10}, {10, 3}], 2, 1])

enter image description here

答案 4 :(得分:2)

关于你的上一个问题:如果你想要一种ListLinePlot3D代替ListPointPlot,你可以简单地执行以下操作:

pointList = 
  Table[{t, Sin[t] + 5 Sin[t/10], Cos[t] + 5 Cos[t/10], 
    t + Cos[t/10]}, {t, 0, 100, .5}];

ListPointPlot3D[pointList[[All, {2, 3, 4}]]] /. Point -> Line

enter image description here

当然,通过这种方式,您无法设置行属性,因此如果需要,您必须稍微更改规则:

ListPointPlot3D[pointList[[All, {2, 3, 4}]]] /. 
       Point[a___] :> {Red, Thickness[0.02], Line[a]}

enter image description here

ListPointPlot3D[pointList[[All, {2, 3, 4}]]] /. 
 Point[a___] :> {Red, Thickness[0.002], Line[a], Black, Point[a]}

enter image description here

但是,为什么不使用Graphics3D和一些图形基元?