Индивидуальная окраска точек в 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
).