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?

採用された回答
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 件のコメント
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:
- 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.
Thank you very much! Very detailed and informative. I learned a lot. :)
Bruno Luong
2023 年 7 月 21 日
編集済み: Bruno Luong
2023 年 7 月 21 日
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.
Bruno Luong
2023 年 7 月 21 日
編集済み: Bruno Luong
2023 年 7 月 21 日
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. :)
その他の回答 (0 件)
カテゴリ
ヘルプ センター および File Exchange で Data Distribution Plots についてさらに検索
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- 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)
