Пользовательская функция ColorFunction / ColorData в ArrayPlot (и аналогичные функции)

Это связано с вопросом Саймона об изменении ColorData по умолчанию в Mathematica. В то время как все решения касались проблемы изменения ColorData в линейных графиках, я не совсем нашел обсуждение полезным в изменении ColorFunction / ColorData в ] ContourPlot / ArrayPlot / Plot3D и т. Д.

TL; DR:

enter image description here

Теперь проделав то же самое в mma, что и:

xMax = 3; yMax = 3;
img = Transpose@
   Table[Sin[y ^3 + x^2], {x, -xMax, xMax, 0.01}, {y, -yMax, yMax, 
     0.01}];
plot = ArrayPlot[img, ColorFunction -> ColorData["Rainbow"], 
   AspectRatio -> 1, 
   FrameTicks -> {FindDivisions[{0, (img // Dimensions // First) - 1},
       4], FindDivisions[{0, (img // Dimensions // Last) - 1}, 4], 
     None, None}, 
   DataReversed -> 
    True] /. (FrameTicks -> {x_, 
      y_}) :> (FrameTicks -> {x /. {a_?NumericQ, b_Integer} :> {a, 
         2 xMax (b/((img // Dimensions // First) - 1) - 1/2)}, 
      y /. {a_?NumericQ, b_Integer} :> {a, 
         2 yMax (b/((img // Dimensions // Last) - 1) - 1/2)}})

Я получил следующий график:

enter image description here

Я предпочитаю насыщенные, яркие цвета в MATLAB пастельным / тусклым цветам mma. Как мне заставить mma использовать эти цвета, если у меня есть значения RGB цветовой карты из MATLAB?

Вы можете загрузить значения RGB цветовой карты по умолчанию в MATLAB и импортировать их в mma как

cMap = Transpose@Import["path-to-colorMapJet.mat", {"HDF5", 
      "Datasets", "cMap"}];

cMap ] представляет собой массив 64x3 значений между 0 и 1 .

Чтобы дать вам некоторую предысторию, вот некоторый относящийся к делу текст из документации MathWorks по карте цветов.

Карта цветов - это матрица реальных числа от 0,0 до 1,0. Каждый ряд - вектор RGB, определяющий один цвет. K-я строка цветовой карты определяет k-й цвет, где map (k, :) = [r (k) g (k) b (k)]) определяет интенсивность красного, зеленого и синего цветов.

Здесь map = cMap и m = 64 ].

Я попытался ковыряться в ColorDataFunction и увидел, что формат ColorData похож на цветовую карту . Однако я не уверен, как заставить ArrayPlot использовать его (и, по-видимому, он должен быть таким же для других функций построения графиков).


Кроме того, поскольку мое упражнение здесь предназначено исключительно для достижения уровня комфорта в mma, аналогично тому, что у меня есть в MATLAB, я был бы признателен за комментарии и предложения по улучшению моего кода. В частности, я не очень доволен своим советом по "исправлению" FrameTicks ... безусловно, должен быть более приятный / простой способ сделать это.

10
задан Zoe 5 June 2019 в 18:48
поделиться