I have a 1000x1000 matrix the MatrixPlot of which gives this graph:
The code is
matrixplot1 = MatrixPlot[data, DataReversed -> {True, False},
PlotLegends -> Automatic]
Since this matrix is obtained by sampling a set of data with X and Y coordinates in 1000x1000 grid the number in the i-th and j-th row and column indicates the number of occurrences between i-1 and j-1.
I would like to have the data on the Log10 scale and on the 0-1 interval for both X and Y axes. For these reasons I did the following:
- I transformed the matrix in a {x,y,z} list as follows
densityData = Flatten[ParallelTable[{(j - 0.5)/1000, (i - 0.5)/1000,
data[[i, j]]}, {i, 1, 1000}, {j, 1, 1000}], 1];
- Then I used the DensityListPlot function:
graphDensityPlotLog =
ListDensityPlot[densityData,
PlotLegends -> BarLegend[Automatic, LegendMarkerSize -> 0.4*imagesize],
ScalingFunctions -> "Log10",
FrameStyle -> Directive[Thick, Black],
ColorFunction -> ColorData[{"SunsetColors", "Reverse"}],
FrameLabel -> {"Quantity X", "Quantity Y"},
FrameTicksStyle -> Directive[Black, 1.1*fontsize],
LabelStyle -> Directive[Black, 1.3*fontsize],
PlotRangePadding -> 0,
ImageSize -> imagesize];
Because of the interpolation, there are colored bands in zones that are without any data. So I tried to obtain the same graph directly by the MatrixPlot with the following code:
log10Mod[x_] := If[x == 0, 0, Log10[x]];
log10Mod /@ {0, 1, 2, 3}
graphDensityPlotLog2 =
MatrixPlot[data, DataReversed -> {True, False},
FrameLabel -> {"Quantity X", "Quantity Y"},
PlotRange -> {{1, 550}, {1, 1000}},
PlotRangePadding -> 20,
FrameStyle -> Directive[Thick, Black],
FrameTicksStyle -> Directive[Black, 1.1*fontsize],
LabelStyle -> Directive[Black, 1.3*fontsize],
ImageSize -> imagesize,
ColorFunction -> (ColorData[{"SunsetColors", "Reverse"}][
Rescale[log10Mod[#], log10Mod /@ {0, 200}]] &),
ColorFunctionScaling -> False,
PlotLegends ->
Placed[BarLegend[{(ColorData[{"SunsetColors", "Reverse"}][
Rescale[#, log10Mod /@ {0, 200}]] &), log10Mod /@ {0, 200}},
LegendMarkerSize -> 400,
LabelStyle -> Directive[Black, 25, FontFamily -> "Times"]], {1.0,
0.5}]]
I am not able to find a way to obtain the graph I obtain with the ListDensityPlot but from the MatrixPlot and without those wrong bands.
Thank you for your help!
Edit: based on the comment I made the following graph
fticks[min_, max_, bigstep_, smallstep_] :=
Table[If[Mod[i, bigstep] == 0, {i + min,
ToString[If[IntegerQ[i + min], i + min, (i + min)/1.]], {.01,
0}}, {i + min, " ", {.005, 0}}], {i, 0, max - min, smallstep}]
fticksNoText[min_, max_, bigstep_, smallstep_] :=
Table[If[Mod[i, bigstep] == 0, {i + min, " ", {.01, 0}}, {i + min,
" ", {.005, 0}}], {i, 0, max - min, smallstep}]
fticksNoBounds[min_, max_, bigstep_, smallstep_] :=
Table[If[Mod[i, bigstep] == 0 && i != 0 &&
i != (max - min), {i + min,
ToString[If[IntegerQ[i + min], i + min, (i + min)/1.]], {.01,
0}}, {i + min, " ", {.005, 0}}], {i, 0, max - min, smallstep}]
fticksReversed[min_, max_, bigstep_, smallstep_] :=
Table[If[Mod[i, bigstep] == 0, {i + min,
ToString[If[IntegerQ[max - i], max - i, (max - i)/1.]], {.01,
0}}, {i + min, " ", {.005, 0}}], {i, 0, max - min, smallstep}]
graphDensityPlotLog3 =
MatrixPlot[data, DataReversed -> {True, False},
FrameLabel -> {"Quantity X", "Quantity Y"},
PlotRangePadding -> 0,
DataRange -> {{0, 1}, {0, 1}},
PlotRange -> {{0, 1}, {0, 0.55}},
FrameStyle -> Directive[Thick, Black],
FrameTicksStyle -> Directive[Black, 1.1*fontsize],
FrameTicks -> {{fticksReversed[0, 1, 1/10, 1/100],
fticksNoText[0, 1, 1/10, 1/100]}, {fticksNoBounds[0, 1, 2/10,
4/100], fticksNoText[0, 1, 2/10, 4/100]}},
LabelStyle -> Directive[Black, 1.3*fontsize],
ImageSize -> imagesize,
AspectRatio -> 1,
ColorFunction -> (ColorData[{"SunsetColors", "Reverse"}][
Rescale[log10Mod[#], log10Mod /@ {0, 200}]] &),
ColorFunctionScaling -> False,
PlotLegends ->
Placed[BarLegend[{(ColorData[{"SunsetColors", "Reverse"}][
Rescale[#, log10Mod /@ {0, 200}]] &), log10Mod /@ {0, 200}},
LegendMarkerSize -> 400,
LabelStyle -> Directive[Black, 25, FontFamily -> "Times"]], {1.0,
0.5}]]
I had to define the ticks in order to put them in a MatrixPlot going from zero to one.
The problem of the legend bar remains to be solved.
MatrixPlot[data, DataRange -> {{0, 1}, {0, 1}}]
orMatrixPlot[Log10@data, DataRange -> {{0, 1}, {0, 1}}]
? $\endgroup$ – kglr Feb 13 '20 at 11:03ListDensityPlot[Table[Sin[j^2 + i], {i, 0, Pi, 0.5}, {j, 0, Pi, 0.5}], Mesh -> None, InterpolationOrder -> 0, PlotRange -> All]
$\endgroup$ – yarchik Feb 13 '20 at 11:04