Цветовой график по порядку точек в списке - Mathematica - PullRequest
5 голосов
/ 20 августа 2011

У меня есть список трехмерных точек, упорядоченных по времени.Есть ли способ построить точки так, чтобы я мог получить визуальное представление, которое также включает информацию о том, где в списке произошла точка?Моя первоначальная мысль состоит в том, чтобы найти способ закрасить точки в порядке их построения.

ListPlot3D накладывает лист на точки, независимо от порядка, в котором они были нанесены.

ListPointPlot просто показывает точки, но не указывает, в каком порядке они были построены.Именно здесь я думаю о раскраске точек в соответствии с порядком их появления в списке.

ListLinePlot, похоже, не имеет 3D-кузена, в отличие от многих других функций построения графиков.

Ответы [ 5 ]

12 голосов
/ 20 августа 2011

Вы также можете сделать что-то вроде

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

5 голосов
/ 20 августа 2011

Поскольку вы не предоставили примеров, я придумал некоторые из них, создав 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: показать большой набор точек, чтобы продемонстрировать, что очень полезно видеть качественный тренд во времени в случаях, когда стрелки не будут легко масштабироваться.

EDIT3: добавлена ​​однострочная версия.

4 голосов
/ 20 августа 2011

Я думаю, что метод Хайке лучший, но она сделала его слишком сложным, ИМХО.Я бы использовал:

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

enter image description here

(данные ACL)

2 голосов
/ 20 августа 2011

Относительно вашего последнего вопроса: если вы хотите иметь вид 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 и несколько графических примитивов?

2 голосов
/ 20 августа 2011
Graphics3D@(Arrow /@ Partition[RandomInteger[{0, 10}, {10, 3}], 2, 1])

enter image description here

...