Это связано с вопросом Саймона об изменении ColorData по умолчанию в Mathematica. Несмотря на то, что все решения касались проблемы изменения ColorData
на линейных графиках, я не нашел обсуждения, которое могло бы помочь изменить ColorFunction
/ColorData
в ContourPlot
/ArrayPlot
/Plot3D
и т.д.
TL;DR: есть ли способ заставить mma использовать пользовательские цвета в ArrayPlot/ContourPlot/etc.
Рассмотрим следующий пример графика функции
sin(x^2+y^3)
которую я создал в MATLAB:
Теперь делаю то же самое в ММА как:
xMax = 3; yMax = 3;
img = [email protected]
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)}})
Я получаю следующий сюжет:
Я предпочитаю насыщенные, яркие цвета в MATLAB вместо пастельных/тусклых цветов. Как заставить mma использовать эти цвета, если у меня есть значения RGB цветовой карты из MATLAB?
Вы можете загрузить значения RGB цветовой карты по умолчанию в MATLAB и импортировать ее в mma как
cMap = [email protected]["path-to-colorMapJet.mat", {"HDF5",
"Datasets", "cMap"}];
cMap
- это массив значений 64x3
от 0
до 1
.
Просто, чтобы дать вам некоторое представление, вот соответствующий текст из документации MathWorks на карте цветов.
Цветовая карта - это матрица размером 3 на 3 из вещественных чисел от 0,0 до 1,0. Каждая строка представляет собой вектор RGB, который определяет один цвет. K-я строка цветовой карты определяет k-й цвет, где map (k, :) = [r (k) g (k) b (k)]) определяет интенсивность красного, зеленого и синего цветов.
Здесь map=cMap
, а m=64
.
Я пытался тыкать ColorDataFunction
, и я вижу, что ColorData
формат похож на colormap
. Однако я не уверен, как заставить ArrayPlot
использовать его (и, вероятно, он должен быть таким же для других функций ArrayPlot
).
Кроме того, поскольку мое упражнение здесь состоит в том, чтобы просто достичь уровня комфорта в mma, подобно тому, что я имею в MATLAB, я был бы признателен за комментарии и предложения по улучшению моего кода. В частности, я не слишком доволен своим взломом способа "исправить" FrameTicks
... конечно, должен быть более хороший/более простой способ сделать это.