3
votes

Given scatter data, or a matrix, I would like to generate a nice plot such as the one shown below, with all 3 histograms and a colored matrix. I'm specifically interested in the diagonal histogram, which ideally, would correspond to the diagonals of a matrix:

www.med.upenn.edu/mulab/jpst.html

Source figure: www.med.upenn.edu/mulab/jpst.html

The existing command scatterhist is not that powerful to generate this type of graph. Any ideas?

Thanks!

EDIT:

Following @Cris Luengo's hints, I came up with the following code which does some first work at the inclined histogram: WORK IN PROGRESS (HELP WELCOME)!!

b = [0     1     2     3     4     5     6     7     8     9    10];
h = [0.33477 0.40166 0.20134 0.053451 0.008112 0.000643 2.7e-05 0 0 0  0];
wid = 0.25; bb = sort([b-wid b-wid b+wid b+wid]);
kk = [zeros(numel(h),1) h(:) h(:) zeros(numel(h),1)];
kk = reshape(kk',[1,numel(kk)]);

pp=patch(bb,kk,'b');axis([-.5 5 0 .5])
set(gca,'CameraUpVector',[-1,.08,0]);axis square

enter image description here

EDIT 2: Using rotation

phi = pi/4;
R = [cos(phi),-sin(phi);sin(phi),cos(phi)];
rr = [bb' kk'] * R;
bb = rr(:,1); kk = rr(:,2);
patch(bb,kk,'b'); axis([-.5 3 -4 .5])

enter image description here

1
This will require quite a lot of hand "hacking" of the plotting functions. There is no easy way. - Ander Biguri
The figure source says that you can request the code from the authors. Have you tried that? Also, I suggest you take a look at the visualization capabilities of the Bioinformatics toolbox (although I haven't seen anything exactly like what you need, there are other types of visualizations you might find useful). - Dev-iL

1 Answers

0
votes

Here is a recipe to plot the diagonal histogram, if you can do that I’m sure you can figure out the rest too.

  1. Compute the histogram, the bin counts are h, the bin centers are b.

  2. Build a coordinate matrix, attaching the coordinates of a point on the x-axis at the left and right ends of the histogram:

    coords = [b(:),h(:)];
    coords = [coord;b(end),0;b(1),0];
    
  3. Using patch you can now plot the histogram as follows:

    patch(coords(1,:),coords(2,:));
    
  4. To plot a rotated histogram you can simply multiply the coords matrix with a rotation matrix, before using patch:

    phi = pi/4;
    R = [cos(phi),-sin(phi);sin(phi),cos(phi)];
    coords = R * coords;
    

You might need to shift the plot to place it at the right location w.r.t. the other elements.

I recommend that you place all these graphic elements in the same axes object; you can set the axes’ visibility to 'off' so that it works only as a canvas for the other elements.

It will be a bit of work to get everything placed as in the plot you show, but none of it is difficult. Use the low-level image, line,patch and text to place those types of elements, don’t try to use the higher-level plotting functions such as plot, they don’t provide any benefits over the low-level ones in this case.