How to get heatmap values in appdesigner?

7 views (last 30 days)
Hi All!
I'm building an app, and I am using heatmap to visualize some data. I am plotting heatmap on a Panel. When I click on a cell of heatmap, it displays X and Y values. For further calculations I want to extract which cell the user clicked on. So what I need basically, is that when the user clicks on one of the heatmap cells fome function registers the coordinates (X,Y values) of the cell that have been clicked on. I don't know if it is possible with heatmap. Maybe there are other plot types with which it is easier to implement. Any solutions or siggestions?
  3 Comments
Csanad Levente Balogh
Csanad Levente Balogh on 13 Aug 2021
Hi!
Thank you! It is not exactly what I was looking for but I might be able to go somewhere from here. What I would need actually sound very easy, still I have not found a solution for it. So for example, if I have a 5X7 matrix visualised with heatmap or an other function, and the user clickes on one of the cells, lets's say the cell in the third row and second column, the answer should be [3 2].
Adam Danz
Adam Danz on 13 Aug 2021
It would be simple but accessing the datacursor in heatmap is not simple and replacing it with a customizable datatip is still not supported to my knowledge. heatmap is notoriously difficult to customize and it's often necessary to use alternatives such as imagesc or histogram2 or surf to achieve customization.
Dave B's approach below (also see comments under that answer) is a simple alternative.
If you want to stick with heatmap, see methods 4 and 5 in the 2nd link Mario provided.

Sign in to comment.

Accepted Answer

Dave B
Dave B on 13 Aug 2021
Edited: Dave B on 13 Aug 2021
Is this the sort of thing you're looking for?
h=imagesc(rand(5,7));
h.ButtonDownFcn=@(~,hit)disp(round(hit.IntersectionPoint(1:2)));
Note that this disp is just for testing, you'd probably do something more interesting there, and if it was more than a single line you can just pass in a function (or more likely method on your app) like any other callback.
  6 Comments
Adam Danz
Adam Danz on 13 Aug 2021
Yeah, the euclidean distance to grid centers in my comment (using hypot) isn't necessary and the first two lines in your comment above are more efficient. But since the OP wants to return the indicies rather than the X/YData, the last two lines in your comment above are not needed. Actually, I believe xind and yind are the solutions so it's much easier than my approach.
I also realized that my approach (and this one) isn't reliable for non-uniform grids as I incorrectly claimed in my solution. Imagine clicking within a large grid cell very close to a border and the bordering cell is very narrow. The click location would be closer to the neighboring grid cell center than it would be to the center of the larger cell that contained the click. But this doesn't matter if the user is trying to replicate heatmap since that function does not produce non-uniform grids.
The solution to support non-uniform grids would require pairs of <=, > conditions for x and y coordinates or a more fancy and probably less-efficient point-in-polygon approach.
Csanad Levente Balogh
Csanad Levente Balogh on 9 Oct 2021
Thank you @Adam Danz and @Dave B, this is exactly what I was lookig for!

Sign in to comment.

More Answers (0)

Categories

Find more on Data Distribution Plots in Help Center and File Exchange

Products


Release

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!