Skip to main content

list manipulation - How to partition MatrixPlot graphics?


Is there an easy approach - hopefully built-in - to partitioning MatrixPlot graphics into rows or columns (or both) of graphics sharing the same underlying options?



For example, in the following graphic, the red rectangles indicate where partitions should occur, and the respective sub-Rasters (along with FrameTicks etc) can then be reorganized using Row


enter image description here


This particular graph (excluding the rectangles which were generated in Epilog) has Length 6, of which all but the first Part are related to options. But it's tedious to even list what parts of the partitions component correspond to which parts, which subsequently must be modified - for example FrameTicks are to be repositioned (reindexed).


Obviously, because the "heatmap" color scale is shared among all the members of the desired partition, it's not feasible to partition the matrix prior and then mapping through MatrixPlot



Answer



To expand on my comment, I think the recent post I wrote for the Mathematica.SE blog will be useful. To summarize:



  1. Build a custom temperature scale color function using Blend and your pooled dataset.

  2. Use BaseStyle and related options with a pre-defined set of option value rules to enforce similar styles across the subplot.

  3. Use Grid, not GraphicsGrid to combine plots with different widths.



Here is an example, using the same tick labels as in the blog post. First, here's some data, specified as a 3D list. Notice how I've used the general iteration capabilities of Table to create a list of two 5 by 10 matrices and two 3 by 10 matrices.


heatdata = 
Table[RandomVariate[
LogNormalDistribution[0, 2], {i, 10}], {i, {5, 5, 3, 3}}];

Next we define the custom Blend to scale across the whole data set. Note that Min and Max work for the whole data set even though it's a nested list, but you need to Flatten the data before applying Mean.


myblend = 
Evaluate@Blend[{{Min[heatdata], Blue}, {Mean[Flatten@heatdata],
White}, {Max[heatdata], Orange}}, #] &


(* Blend[{{0.00629577, RGBColor[0, 0, 1]}, {6.37397,
GrayLevel[1]}, {215.341, RGBColor[1, 0.5, 0]}}, #1] & *)

You can now Map the MatrixPlot function to each matrix in the data set. Notice that I'm also using a pure function to determine the approprate AspectRatio so it all fits together nicely. Then it's just a matter of partitioning the plots the way you want and applying Grid.


Grid[Partition[
MatrixPlot[#, ColorFunctionScaling -> False,
AspectRatio -> Divide @@ Dimensions[#], ColorFunction -> myblend,
FrameStyle -> AbsoluteThickness[0], PlotRangePadding -> 0,
FrameTicks -> {{ytix, None}, {xtix, None}}] & /@ heatdata, 2]]


enter image description here


Comments

Popular posts from this blog

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...