How to plot the maximum regions given several functions in a 2D plot?

I have three functions A(i,j), B(i,j), and C(i,j) which are functions of i and j , where a<i<b and a<j<b.
I want to distinguish and plot regions where each of these functions has the maximum value. Can someone please help me get started?

 Accepted Answer

idx = max(cat(3, A, B, C), [], 3);
cmap = [.3 0 0; %light red
0 .5 0; %light green
0 0 .8]; %blue
pcolor(idx); colormap(cmap)
xlabel('i'); ylabel('j')
fake(1) = plot(nan, nan, 'DisplayName', 'A', 'Color', cmap(1));
fake(2) = plot(nan, nan, 'DisplayName', 'B', 'Color', cmap(2));
fake(3) = plot(nan, nan, 'DisplayName', 'C', 'Color', cmap(3));
legend(fake)

10 Comments

Thank you!!! So fast!
As I am trying to learn, may I ask why plot has nan in two of its arguments?
pcolor() creates a surface plot internally.
If you were to create an automatic legend for a surface plot, there would be exactly one legend entry for the entire surface plot. We want to created one legend entry for each of the functions we are dealing with.
MATLAB has no direct way of saying, "Add additional legend entries with these properties."
So, instead we use a combination of tricks:
  1. We create one extra graphics object for each legend entry we wish to add
  2. We pass only the handles for those exttra graphics objects to legend(). When you pass legend() a series of graphics objects, it will create legend entries only for the handles you pass in -- in particular in this case, it would not create a legend entry for the surface created by pcolor, just for the plot handles stored in the fake vector
  3. We give Nan coordinates for the extra graphics objects that we are creating just for the purpose of creating legend entries. Graphics objects such as lines and surfaces are only visible if they have some finite coordinates (and in some cases at least multiple adjacent finite coordinates.) You could use inf or -inf for the coordinates instead of NaN, but NaN tends to be used as a matter of informal convention (using NaN instead of -inf or inf makes it easier to do some calculations on the data.)
  4. We do not simply use graphics objects with regular finite coordinates but set Visible off for them, because the finite coordinates can influence what MATLAB picks for the tick positions and how much data is to be visible; non-finite coordinates are ignored for the purpose of calculating such things
So we plot() NaN to create invisible graphics objects that do not disturb other graphics properties, and we do that because the invisible graphics objects still get legend entries.
Thank you very much! Very detailed and informative. I learned a lot. :)
Have you tested the Walter's code? It looks like there are few bugs, it sould be this
A=rand(20);
B=rand(20);
C=rand(20);
[~,idx] = max(cat(3, A, B, C), [], 3); % BUG
cmap = [.3 0 0; %light red
0 .5 0; %light green
0 0 .8]; %blue
pcolor(idx); colormap(cmap);
xlabel('i'); ylabel('j')
hold on % Add
fake(1) = plot(nan, nan, 'DisplayName', 'A', 'Color', cmap(1,:)); % BUG
fake(2) = plot(nan, nan, 'DisplayName', 'B', 'Color', cmap(2,:)); % BUG
fake(3) = plot(nan, nan, 'DisplayName', 'C', 'Color', cmap(3,:)); % BUG
legend(fake)
Oh Thanks. I did try out the code and it did give me an error.
Thank you for fixing it.
Notice that the pcolor plot 19x19 rectangular colored patches, but the data (idx) is 20 x 20.
I don't know how pcolor does the reduction (I rarely use it)
EDIT the color patch are average of the 4 surrounding values, so it not very directly represents the max index.
I also never use pcolor for just that reason. I'd recommend using image or imshow instead.
True, imagesc() would be better than pcolor() here.
It is still not clear to me how pcolor graphical result has 3 colors, and not more as I assume it takes the average.
A=rand(5);
B=rand(5);
C=rand(5);
[~,idx] = max(cat(3, A, B, C), [], 3)
idx = 5×5
3 2 3 2 1 2 3 2 1 1 2 3 3 1 3 1 2 3 1 1 1 1 2 3 2
idx3 = cat(3,idx(1:end-1,1:end-1), ...
idx(1:end-1,2:end), ...
idx(2:end,2:end), ...
idx(2:end,1:end-1));
mean(idx3,3)
ans = 4×4
2.5000 2.5000 2.0000 1.2500 2.5000 2.7500 1.7500 1.5000 2.0000 2.7500 2.0000 1.5000 1.2500 2.0000 2.2500 1.7500
min(idx3,[],3)
ans = 4×4
2 2 1 1 2 2 1 1 1 2 1 1 1 1 1 1
max(idx3,[],3)
ans = 4×4
3 3 3 2 3 3 3 3 3 3 3 3 2 3 3 3
pcolor(idx);
It must have some odd algorithm to decide the color.
But never mind I rarely (never) use pcolor.
Thank you all for the feedback on pcolor. Appreciate it. :)

Sign in to comment.

More Answers (0)

Categories

Asked:

on 21 Jul 2023

Commented:

on 21 Jul 2023

Community Treasure Hunt

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

Start Hunting!