这与Mathematica中Simon的question on changing default ColorData有关。尽管所有解决方案都解决了更改线图中的ColorData
的问题,但我认为该讨论对更改ColorFunction
/ ColorData
/ ContourPlot
等中的ArrayPlot
/ Plot3D
并没有帮助。
TLDR:有没有办法让mma在ArrayPlot / ContourPlot / etc中使用自定义颜色。
请看下面在MATLAB中创建的函数sin(x^2+y^3)
的示例图:
现在在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)}})
我得到以下情节:
与mma的柔和/暗色调相比,我更喜欢MATLAB中的丰富,明亮的颜色。如果我具有MATLAB中颜色图的RGB值,如何获得mma以使用这些颜色?
您可以在MATLAB中下载默认颜色图的RGB值,然后将其导入到mma中,如下所示:
cMap = Transpose@Import["path-to-colorMapJet.mat", {"HDF5",
"Datasets", "cMap"}];
cMap
是64x3
和0
之间的值的1
数组。为了给您一些背景知识,这是MathWorks documentation on colormap中的一些相关文字
色彩图是实数的m×3矩阵
介于0.0和1.0之间的数字。每一行
是定义一个
颜色。色彩图的第k行
定义第k种颜色,其中map(k,:)
= [r(k)g(k)b(k)])指定红色,绿色和蓝色的强度。
在这里
map=cMap
和m=64
。我尝试戳
ColorDataFunction
,发现ColorData
格式类似于colormap
。但是,我不确定如何使用ArrayPlot
来使用它(并且对于其他绘图功能,它应该是相同的)。另外,由于我在这里的练习纯粹是为了达到mma的舒适度,类似于我在MATLAB中所做的那样,因此,我希望能对改进我的代码提出意见和建议。具体来说,我对“修复”
FrameTicks
的方法不太满意...当然肯定有更好/更轻松的方法可以做到。 最佳答案
将此替换为ColorData["Rainbow"]
:
Function[Blend[RGBColor @@@ cMap, Slot[1]]]
你得到这个:
关于第二个问题,您可以这样操作:
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 -> Function[Blend[RGBColor @@@ cMap, Slot[1]]],
AspectRatio -> 1, FrameTicks -> Automatic,
DataRange -> {{-xMax, xMax}, {-yMax, yMax}}, DataReversed -> True]
但是为什么不使用DensityPlot?
DensityPlot[Sin[y^3 + x^2], {x, -xMax, xMax}, {y, -yMax, yMax},
ColorFunction -> Function[Blend[RGBColor @@@ cMap, Slot[1]]],
PlotPoints -> 300]
编辑
请注意,在第二个图中,y范围标记被颠倒了。那是因为它考虑了DataReversed设置。 ArrayPlot以与在屏幕上打印阵列内容时出现的顺序相同的顺序绘制阵列的行。因此,第一行绘制在顶部,最后一行绘制在底部。高行值对应于低y值,反之亦然。 DataReversed-> True可以纠正这种现象,但是在这种情况下,它也可以“纠正” y值。一种解决方法是从高y值开始向下填充到较低的y值来填充数组。在这种情况下,您不需要DataReversed:
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 -> Function[Blend[RGBColor @@@ cMap, Slot[1]]],
AspectRatio -> 1, FrameTicks -> Automatic,
DataRange -> {{-xMax, xMax}, {-yMax, yMax}}]