How to plot the maximum regions given several functions in a 2D plot?
You are now following this question
- You will see updates in your followed content feed.
- You may receive emails, depending on your communication preferences.
An Error Occurred
Unable to complete the action because of changes made to the page. Reload the page to see its updated state.
Show older comments
0 votes
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
Walter Roberson
on 21 Jul 2023
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
EllaD
on 21 Jul 2023
Thank you!!! So fast!
As I am trying to learn, may I ask why plot has nan in two of its arguments?
Walter Roberson
on 21 Jul 2023
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:
- We create one extra graphics object for each legend entry we wish to add
- 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
- 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.)
- 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.
EllaD
on 21 Jul 2023
Thank you very much! Very detailed and informative. I learned a lot. :)
Bruno Luong
on 21 Jul 2023
Edited: Bruno Luong
on 21 Jul 2023
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)

EllaD
on 21 Jul 2023
Oh Thanks. I did try out the code and it did give me an error.
Thank you for fixing it.
Bruno Luong
on 21 Jul 2023
Edited: Bruno Luong
on 21 Jul 2023
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.
Image Analyst
on 21 Jul 2023
I also never use pcolor for just that reason. I'd recommend using image or imshow instead.
Walter Roberson
on 21 Jul 2023
True, imagesc() would be better than pcolor() here.
Bruno Luong
on 21 Jul 2023
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.
EllaD
on 21 Jul 2023
Thank you all for the feedback on pcolor. Appreciate it. :)
More Answers (0)
Categories
Find more on Data Distribution Plots in Help Center and File Exchange
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)