(Надеюсь, это еще не слишком поздно.)
Как оказалось, даже не нужно хранить весь набор из шестидесяти четырех RGBColor[]
директив для этой цели.использования с Blend[]
Подсказка, что это, безусловно, имеет место, предоставляется ListPlot[]
s столбцов cMap
:
{rr, gg, bb} = Transpose[Rationalize[cMap]];
GraphicsGrid[{MapThread[
ListPlot[#1, DataRange -> {0, 1}, Frame -> True,
GridLines -> {{1/9, 23/63, 13/21, 55/63}, None},
PlotLabel -> #2] &, {{rr, gg, bb}, {"Red", "Green", "Blue"}}]}]
![LisPlot[]s of RGB components of MATLAB's jet colormap](https://i.stack.imgur.com/taV8o.png)
, и мы видим,что неявно, функции, представляющие эти компоненты, являются кусочно-линейными .Поскольку Blend[]
обязательно выполняет линейную интерполяцию между цветами, если мы можем найти те цвета, которые соответствуют "углам" в кусочно-линейных графиках, мы можем исключить все остальные цвета между этими углами (поскольку Blend[]
выполнит интерполяцию длянам), и, следовательно, потенциально придется носить только, скажем, семь, а не шестьдесят четыре цвета.
Из прочтения приведенного выше кода вы заметите, что я уже нашел эти точки перехода для вас (подсказка: проверьте настройку для GridLines
).Дополнительные указания относительно того, какими могут быть эти цвета, приведены в документации для colormap()
:
jet
в диапазоне от синего до красного и проходят через цвета голубой, желтыйи оранжевый.
Может ли это быть?Давайте проверим:
cols = RGBColor @@@ Rationalize[cMap];
Position[cols, #][[1, 1]] & /@ {Blue, Cyan, Yellow,
Orange // Rationalize, Red}
{8, 24, 40, 48, 56}
Это просто дает позиции цветов в массиве cols
, но мы можем изменить масштаб, чтобы соответствовать диапазону аргументов, ожидаемому от карты цветов:
(# - 1)/(Length[cols] - 1) & /@ %
{1/9, 23/63, 13/21, 47/63, 55/63}
и именно там находятся точки прерывания кусочно-линейных функций, соответствующих RGB-компонентам цветовой карты.Это пять цветов;чтобы обеспечить плавную интерполяцию, мы добавляем в этот список первый и последний цвета,
cols[[{1, Length[cols]}]]
{RGBColor[0, 0, 9/16], RGBColor[1/2, 0, 0]}
, сопоставляя исходный список cols
до семи.Поскольку 7/64 составляет приблизительно 11%, это довольно большая экономия.
Таким образом, мы ищем цветовую функцию:
jet[u_?NumericQ] := Blend[
{{0, RGBColor[0, 0, 9/16]}, {1/9, Blue}, {23/63, Cyan}, {13/21, Yellow},
{47/63, Orange}, {55/63, Red}, {1, RGBColor[1/2, 0, 0]}},
u] /; 0 <= u <= 1
Мы делаем два сравнения для проверки jet[]
.Вот график градиента, сравнивающий ColorFunction
s jet
и Blend[cols, #]&
:
GraphicsGrid[{{
Graphics[Raster[{Range[100]/100}, ColorFunction -> (Blend[cols, #] &)],
AspectRatio -> .2, ImagePadding -> None, PlotLabel -> "Full",
PlotRangePadding -> None],
Graphics[Raster[{Range[100]/100}, ColorFunction -> jet],
AspectRatio -> .2, ImagePadding -> None,
PlotLabel -> "Compressed", PlotRangePadding -> None]}}]

и вот механическая проверка того, что 64 цвета в cols
хорошо воспроизведено:
Rationalize[Table[jet[k/63], {k, 0, 63}]] === cols
True
Теперь вы можете использовать jet[]
в качестве ColorFunction
для любой функции построения графиков, которая его поддерживает.Наслаждайтесь!