Mathematica

Mathematica, MATLAB以及Python的不同函数库都有自己风格的颜色图,当使用其中一种软件的时候,想用另外一个软件的颜色图就需要费一些功夫。
我之前写了一篇笔记记录如何将Python、MATLAB以及Origin中使用彼此的颜色图
:
知乎:如何获取Python的颜色图供Origin使用?
个人博客:如何获取Python的颜色图供Origin使用?

以及如何自定义颜色图
知乎:MATLAB如何自定义颜色图(colormap)
个人博客:MATLAB如何自定义颜色曲线

最近我想再Mathematica使用常见的”jet”颜色图,并且希望将Mathematica的颜色图导出在MATLAB使用,中间遇到了一些问题,在这里将解决方法记录下来。

如何在Mathematica中更好的使用“jet”函数

如何使用Jet函数

“jet”颜色图的使用可以通过手动定义函数的方法来实现,

1
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

解决思路来自
Custom ColorFunction/ColorData in ArrayPlot (and similar functions)
在Mathematica中使用时只需要添加
1
2
Colorfunction->jet


即可。

如何自定义颜色的取值范围

在Mathematica中绘图时,采用ListDensityPlot函数画出来的颜色图的取值范围默认是数据的最大值或者最小值,这在一些情况下不能满足我们的需要,因为我们希望颜色图对应的范围为一些整数值,在MATLAB中可以直接通过caxis([min,max])来定义颜色范围,而在Mathematica中则需要自己进行定义,

1
2
3
4
DensityPlot[Sin[x]*Cos[y], {x, -1, 1}, {y, -1, 1}, 
ColorFunction -> (ColorData["TemperatureMap",
Rescale[#, {-1, 1}]] &), ColorFunctionScaling -> False,
PlotLegends -> BarLegend[{Automatic, {-1, 1}}]]

test
上面的绘图方式将范围限制了(-1,1),注意关键是ColorFunction -> (ColorData["TemperatureMap", Rescale[#, {-1, 1}]] &), ColorFunctionScaling -> False, PlotLegends -> BarLegend[{Automatic, {-1, 1}}]这三句命令。这是对于系统内部就有的颜色函数,可以采用(ColorData["TemperatureMap", Rescale[#, {-1, 1}]] &)的方式来缩放范围,如果是我们自己定义的“jet”函数呢?我在Mathematica StackExchange上问了,但是在得到答复之前自己解决了:
1
2
3
4
DensityPlot[Sin[x]*Cos[y]*0.3, {x, -1, 1}, {y, -1, 1}, 
ColorFunction -> (jet[Rescale[#, {-3, 3}]] &),
ColorFunctionScaling -> False,
PlotLegends -> BarLegend[{Automatic, {-3, 3}}]]

关键是ColorFunction -> (jet[Rescale[#, {-3, 3}]] &)

如何在Mathematica中使用Python或者MATLAB导出的颜色数据

(解决主要来源于StackExchange)
之前讲的jet函数是通过函数精确定义的,更加常见的场景是导入一些MATLAB或者Python的颜色图数据,然后在MATLAB使用。我这里介绍如何使用MATLAB的hot函数,
首先我们使用MATLAB的颜色函数hot产生所需的RGB三维数据,并将其和范围[0,1]合并写成一个四维数组,

1
2
3
4
5
num=256;
var=linspace(0,1,num);
list=hot(num);
hotmap=[var',list];
save('hotmap.mat','hotmap');

这里导出的文件’hotmap.mat’就是颜色数据,需要再在Mathematica打开,
1
2
3
4
5
6
SetDirectory[NotebookDirectory[]];
cmapdata = Import["./hotmap.mat"];
hotmapdata =
Table[{cmapdata[[1, l, 1]], RGBColor[cmapdata[[1, l, 2 ;; 4]]]}, {l,
Dimensions[cmapdata][[2]]}];
hotmap = (Blend[hotmapdata, #] &);

然后就可以使用了,例如
1
2
3
4
5
6
7
8
9
10
11
12
13
14
showcolorfunction[color_] := 
With[{opts = {PlotRange -> All, ColorFunction -> color,
PlotPoints -> 40, PlotRangePadding -> None, ImageSize -> 200}},
Column[{DensityPlot[
Cos[x] Sin[y], {x, -2 \[Pi], 2 \[Pi]}, {y, -\[Pi], \[Pi]},
FrameTicks -> None, AspectRatio -> 1/4, opts],
DensityPlot[
10 Cos[x^2] Exp[y], {x, -2 \[Pi], 2 \[Pi]}, {y, -\[Pi], 0},
FrameTicks -> None, AspectRatio -> 1/2, opts],
DensityPlot[x, {x, -1, 1}, {y, 0, 1},
FrameTicks -> {{None, None}, {Automatic, None}},
AspectRatio -> 1/10, opts]}, Center, 0]];

showcolorfunction@hotmap

如何导出Mathematica的颜色图

另外一个要解决的问题是如何导出Mathematica的颜色图?我以颜色图“TemperatureMap”为例,

1
2
3
4
5
6
f = ColorData["TemperatureMap"];
mat = Table[f[x], {x, 0, 1, 0.01}];
TerpColor = mat /. {RGBColor[x_, y_, z_] -> {x, y, z}};
Export["TemperatureMap.mat",
TerpColor];

导出的”TemperatureMap.mat”文件就可以在MATLAB中使用了。