【问题标题】:Color Plot by order of points in list - Mathematica按列表中点的顺序绘制颜色 - Mathematica
【发布时间】:2011-08-19 21:40:51
【问题描述】:

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

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

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

ListLinePlot 似乎没有 3D 表亲,这与许多其他绘图功能不同。

【问题讨论】:

    标签: plot wolfram-mathematica


    【解决方案1】:

    你也可以这样做

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

    【讨论】:

    • 所以我是对的,有一个更简单的方法......我很荣幸能将你的声望点推到 1000 多个 :)
    • 大家有很好的建议;很高兴 Mathematica 提供了这么多方法来实现这一点,但是您先生(或女士)因为您的解决方案简单而收到了绿色检查。
    【解决方案2】:

    由于您没有提供示例,我通过创建 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]
    

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

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

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

    EDIT2:显示大量点以证明在 arrows 不易扩展的情况下及时查看定性趋势非常有用。

    EDIT3:添加了单行版本。

    【讨论】:

      【解决方案3】:

      我认为 Heike 的方法是最好的,但恕我直言,她把它弄得太复杂了。我会使用:

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

      (acl的数据)

      【讨论】:

      • 你说得对,巫师先生,这种方式更优雅(顺便说一句,是她)。
      • @Heike - 正式注明。为了缓解我的无知,我应该能够从你的名字/昵称中推断出这一点吗?
      • 你不知道。 Heike 实际上是我的名字,但它不是很常见(至少不是我来自哪里)并且用于男孩和女孩。
      • @Heike 好的。我现在感觉不那么愚蠢了。怎么发音?
      • 向导:写在International Phonetic Alphabet 中,类似于ɦɛikə。
      【解决方案4】:
      Graphics3D@(Arrow /@ Partition[RandomInteger[{0, 10}, {10, 3}], 2, 1])
      

      【讨论】:

      • 这是显而易见的方法;这种事情的问题在于它不能扩展。例如,用 10000 点试试。无论如何,+1
      【解决方案5】:

      关于你的最后一个问题:如果你想要一种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
      

      当然,通过这种方式你不能设置线属性,所以如果你想的话,你必须稍微改变一下规则:

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

      或与

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

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

      【讨论】:

      • 顺便说一句,我使用了 4D 数组,因为这是我最初的理解时间用于着色。在仔细阅读这个问题时,情况可能并非如此。因此,pointList[[All, {2, 3, 4}]] 可以写为具有 3D 坐标的列表的 pointList。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 2022-01-09
      • 2020-09-23
      • 1970-01-01
      • 2011-07-20
      • 2017-03-07
      相关资源
      最近更新 更多