这与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"}];


cMap64x30之间的值的1数组。

为了给您一些背景知识,这是MathWorks documentation on colormap中的一些相关文字


色彩图是实数的m×3矩阵
介于0.0和1.0之间的数字。每一行
是定义一个
颜色。色彩图的第k行
定义第k种颜色,其中map(k,:)
= [r(k)g(k)b(k)])指定红色,绿色和蓝色的强度。


在这里map=cMapm=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}}]

08-25 19:33