Индивидуальная окраска точек в ListPlot, ErrorListPlot в Mathematica

Я могу получить цветной 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.

Ответ 1

Проблема в том, что Init- > True рисует строку [], которая может быть задана VertexColors для каждой содержащей точки. Я полагаю, что делать то же самое в тех случаях, когда параметр "Вставить" - "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

Ответ 2

Вы можете использовать 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 не будет. Я уверен, что это должно иметь какое-то отношение к деталям реализации, но я не могу придумать, почему это так.

Ответ 3

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

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

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

ColorData["Rainbow"] /@ ([email protected]@data / [email protected])

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

Хорошие точки этого метода заключаются в следующем.

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