Индивидуальная раскраска точек в ListPlot, ErrorListPlot в Mathematica - PullRequest
10 голосов
/ 31 декабря 2011

Я могу получить цветной ListLinePlot, выполнив что-то вроде

ListLinePlot[Range[420, 680, 20], ColorFunction -> "VisibleSpectrum", ColorFunctionScaling -> False]

Mathematica graphics

Однако, как указано в файле справки ("ColorFunction требует по крайней мере одиннабор данных будет Joined "), если я сделаю эквивалент

ListPlot[Range[420, 680, 20], ColorFunction -> "VisibleSpectrum", ColorFunctionScaling -> False]

Mathematica graphics

все мои точки синего цвета.Есть ли хороший способ заставить ColorFunction работать на ListPlot с Joined -> False?

То есть есть ли лучший способ получить что-то вроде

ListPlot[
 List /@ Transpose[{Range[(680 - 420)/20 + 1], Range[420, 680, 20]}], 
 PlotMarkers -> ({Graphics[{#, Disk[]}], 0.05} & /@ ColorData["VisibleSpectrum"] /@ Range[420, 680, 20])
]

?

Mathematica graphics

(Также у кого-нибудь есть объяснение , почему Mathematica требует Joined -> True для использования ColorFunction?)

Редактировать: Я также ищу способ сделать подобную раскраску с помощью ErrorListPlot в пакете ErrorBarPlots.

Ответы [ 3 ]

7 голосов
/ 31 декабря 2011

Проблема в том, что Joined-> True рисует линию [], которой можно присвоить VertexColors для каждой содержащей точки. Я предполагаю, что делать то же самое для точек, когда настройка Joined-> False приводит к ситуациям, когда это не работает. Тем не менее, Line [] и Point [] работают практически одинаково в вашем случае. Так что же насчет

ListLinePlot[Range[420, 680, 20], ColorFunction -> "VisibleSpectrum", 
  ColorFunctionScaling -> False] /. Line[arg___] :> Point[arg]

Mathematica graphics

И, кстати, если вы используете только ListLinePlot, где единственными возникающими директивами Line [] являются те, которые связаны с вашими данными, это должно работать, даже если у вас больше наборов данных и {x, y} координат

data = Transpose[Table[{{x, Sin[x]}, {x, Cos[x]}}, {x, 0, 2 Pi, 0.2}]];
ListLinePlot[data, ColorFunction -> Hue] /. Line[arg___] :> Point[arg]

Mathematica graphics

3 голосов
/ 31 декабря 2011

Вы можете использовать DiscretePlot:

data = Range[420, 680, 20];
DiscretePlot[data[[i]], {i, Length[data]},
   ColorFunction -> "VisibleSpectrum", ColorFunctionScaling -> False,
   Filling -> None]

Mathematica graphics

Если вы строите список точек x, y, это становится немного сложнее:

data = Transpose[{Range[420, 680, 20], Range[400, 530, 10]}];
mapping = Apply[Rule, data, 2];
DiscretePlot[i/.mapping, {i, data[[;;,1]]},
   ColorFunction -> "VisibleSpectrum", ColorFunctionScaling -> False,
   Filling -> None]

Mathematica graphics

Довольно странно, что DiscretePlot позволит вам по-разному раскрасить точки, тогда как ListPlot - нет.Я уверен, что это должно быть как-то связано с деталями реализации, но я не могу придумать причину, почему это так.

1 голос
/ 23 марта 2013

Я тоже сталкивался с этой проблемой в своей работе.Я назначаю цвет каждой точке следующим образом:

data = ...
ListPlot[data] /. Point[args___] :> Point[args, VertexColors -> {c1, c2, ...}]

, где c1 - цвет для первой точки данных и т. Д.Список цветов может быть сгенерирован программно, например,

ColorData["Rainbow"] /@ (Range@Length@data / Length@data)

Вот результат.

Положительные стороны этого метода следующие:

  • Это просто: у нас есть список пар, затем мы создаем соответствующий список цветов.
  • Наш исходный код ListPlot не нужно изменять (например, изменить на ListLinePlot).
...