plot間を色付けしたい

12 views (last 30 days)
Yu
Yu on 17 Nov 2021
Commented: Yu on 18 Nov 2021
こんにちは。
以下画像の赤い2直線の間を色付けしたいのですが、上手くいきません。
添付のmatファイルに対し、以下のコードを実行すると最後の添付画像のようなエラーが発生してしまいます。
良い方法をご存知のかたがいらっしゃいましたら、教えていただけますと嬉しいです。
よろしくお願い致します。
bottom = sample(1:100,1);
height = sample(1:100,2);
top = sample(1:100,3);
clf
close all hidden
x = 0:500;
figure
scatter(bottom,height,10,'DisplayName','Height')
xlim([0 500])
hold on
r1 = plot(x-100,'r','DisplayName','Top');
r2 = plot(x-260,'r','DisplayName','Bottom');
x2 = [x, fliplr(x)];
inBetween = [r1, fliplr(r2)];
fill(x2, inBetween, 'g');
patch([x fliplr(x)], [r1 fliplr(r2)], 'r')
      
Invalid text character. The text '      ' contains an unsupported non-ASCII whitespace character.
hold off
grid on
legend('Location','eastoutside')
xlabel('Depth [m]')
ylabel('Height [m]')
ylim([0 500])
  1 Comment
Atsushi Ueno
Atsushi Ueno on 17 Nov 2021
Edited: Atsushi Ueno on 17 Nov 2021
コメントその1
上記リンク先を参考になさったのだと思います。この例は下図の様に、対象グラフの右側に左右反転したグラフをくっ付けて塗りつぶしたのです。その理由は、塗りつぶす対象図形を「閉じた図形」にする為です。一方さんのグラフは左右反転したグラフを右側にくっ付けても「閉じた図形」にはなりません。←誤った認識でした。fill関数が自動的に閉じた図形と認識してくれます。「必要に応じて、関数 fill は、最後の頂点を最初の頂点に接続して多角形を閉じます。」とfill関数の説明に明記されています。
←誤った認識でした。グラフ描画された範囲も左半分だけです。
コメントその2
プロット関数の戻り値は当該プロットのx 値やy 値だけでなく様々なプロパティを持ったLine オブジェクトです。オブジェクトの名前を書いてもx,yデータを参照している事にはなりません。
test = plot(0:100,0:100);
test
test =
Line with properties: Color: [0 0.4470 0.7410] LineStyle: '-' LineWidth: 0.5000 Marker: 'none' MarkerSize: 6 MarkerFaceColor: 'none' XData: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 … ] YData: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 … ] ZData: [1×0 double] Show all properties

Sign in to comment.

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 17 Nov 2021
Edited: Atsushi Ueno on 17 Nov 2021
コメントを踏まえて、一部を修正しました。
コメントに私の誤った認識がありました。コメントの方を訂正致します
load sample.mat
bottom = sample(1:100,1);
height = sample(1:100,2);
top = sample(1:100,3);
clf
close all hidden
x = 0:500;
figure;
r1 = plot(x-100,'r','DisplayName','Top');
hold on;
r2 = plot(x-260,'r','DisplayName','Bottom');
x2 = [x, fliplr(x)];
inBetween = [r1.YData, fliplr(r2.YData)]; % ←ここを直しました
fill(x2, inBetween, 'g');
% patch(x2, inBetween, 'r'); % ←fill関数もpatch関数も結果は同じです
scatter(bottom,height,10,'blue','DisplayName','Height');
xlim([0 500]);
hold off
grid on
legend('Location','eastoutside')
xlabel('Depth [m]')
ylabel('Height [m]')
ylim([0 500])
  2 Comments
Atsushi Ueno
Atsushi Ueno on 17 Nov 2021
scatter関数を先に実行すると塗りつぶしによって上書きされてしまうので、scatter関数ををfill関数の後ろに移動しました
Yu
Yu on 18 Nov 2021
ありがとうございます!!コメント2を読んで納得しました。
おかげさまで希望する図が描けました。
いつも教えてくださりありがとうございます。

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!