简体   繁体   中英

How to plot a Diagonal Histogram in Matlab

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

在此输入图像描述

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])

在此输入图像描述

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 wrt 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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM