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

plotting - How to draw lines between specified dots on ListPlot?

I would like to create a plot where I have unconnected dots and some connected. So far, I have figured out how to draw the dots. My code is the following: ListPlot[{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4,13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full] I have thought using ListLinePlot command, but I don't know how to specify to the command to draw only selected lines between the dots. Do have any suggestions/hints on how to do that? Thank you. Answer One possibility would be to use Epilog with Line : ListPlot[ {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4, 13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full, Epilog -> { Line[ ...

equation solving - Invert and fit implicitly defined curve

I need to fit an implicitly defined curve. I thought I could get some data out of Solve , and then using FindFit . Therefore, I would like to find the relation the parametric curve defined by $F(x,y)=0$: Solve[-(1/2) + 1/2 (0.41202 BesselK[0, 0.1 Sqrt[x^2 + y^2]] + (0.101483 x BesselK[1, 0.1 Sqrt[x^2 + y^2]])/Sqrt[x^2 + y^2]) == 0, y] But I can't get an output: Solve was unable to solve the system with inexact coefficients or the system obtained by direct rationalization of inexact numbers present in the system. Since many of the methods used by Solve require exact input, providing Solve with an exact version of the system may help. >> Edit: In particular, I would like to fit the data coming from the curve with the expression of another curve, and not with a function $f(x)$. In particular, since this clearly looks like a cardioid , I would like it to fit to something like it. What other strategies could I try?

dynamic - How can I make a clickable ArrayPlot that returns input?

I would like to create a dynamic ArrayPlot so that the rectangles, when clicked, provide the input. Can I use ArrayPlot for this? Or is there something else I should have to use? Answer ArrayPlot is much more than just a simple array like Grid : it represents a ranged 2D dataset, and its visualization can be finetuned by options like DataReversed and DataRange . These features make it quite complicated to reproduce the same layout and order with Grid . Here I offer AnnotatedArrayPlot which comes in handy when your dataset is more than just a flat 2D array. The dynamic interface allows highlighting individual cells and possibly interacting with them. AnnotatedArrayPlot works the same way as ArrayPlot and accepts the same options plus Enabled , HighlightCoordinates , HighlightStyle and HighlightElementFunction . data = {{Missing["HasSomeMoreData"], GrayLevel[ 1], {RGBColor[0, 1, 1], RGBColor[0, 0, 1], GrayLevel[1]}, RGBColor[0, 1, 0]}, {GrayLevel[0], GrayLevel...