bar3を使用し、F​aceColorをi​nterpにした状態​で、z==0の平面の​色を取り除く、または​白にすることはできま​すか

11 views (last 30 days)
Dai
Dai on 29 Jul 2022
Commented: Dai on 31 Jul 2022
Z=[0 1 2 3;1 0 2 3;1 2 0 3];
b=bar3(Z);
colorbar
for k = 1:length(b)
zdata = b(k).ZData;
b(k).CData = zdata;
b(k).FaceColor = 'interp';
end
この後に、z==0の部分だけ透明もしくは白にするコードを付け加えたいです。
実際に起きている問題としては、z==0の平面に画像を挿入した際に、z==0のcolormapの色がモザイク状に表示されてしまうことです。
0をNaNで置き換えることは試しましたが、出力に変化はありませんでした。
  2 Comments
Atsushi Ueno
Atsushi Ueno on 30 Jul 2022
の両方を実行する旨解釈し、回答を変更しました。
  • 面の色を内挿(’interp’)する必要があるので、面の透明度も’interp’に変更する必要がある
  • AlphaData 値の解釈は0/1なので'none'設定としていたが、'scaled' (既定値) に変更

Sign in to comment.

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 29 Jul 2022
Edited: Atsushi Ueno on 30 Jul 2022
透明度の設定を書き加えました。
Z = [0 1 2 3;1 0 2 3;1 2 0 3];
A = repelem(Z,6,4) > 0; % 透明度のデータAを作る
b = bar3(Z);
colorbar
for k = 1:length(b)
zdata = b(k).ZData;
b(k).CData = zdata;
b(k).AlphaData = A(:,k*4-3:k*4); % 透明度のデータを設定
b(k).FaceColor = 'interp'; % 面の色
%b(k).EdgeColor = 'interp'; % エッジの色
b(k).FaceAlpha = 'interp'; % 面の透明度
b(k).EdgeAlpha = 'interp'; % エッジの透明度
end
  • プロットされたバーを変更するには、返された Surface オブジェクトのプロパティを変更します。Surface プロパティの一覧については、Surface のプロパティを参照してください。返される表面の XDataYDataZData の各プロパティは、頂点の組を表すよう設定されています。個別のバーやバーの面の色または透明度を変更するには、該当する頂点について目的のプロパティを設定します。n 個のバーがある系列の場合、返される Surface オブジェクトには 6n 個の頂点が含まれています。
【良く解る解説】
上記ヒントから明らかなように、bar3の構成情報(Surfaceオブジェクト)は、列ごとの設定になります。”EdgeAlpha" と ”FaceAlpha” にスカラ値(1:不透明, 0:透明)を設定出来ますが、スカラ値だと棒1本だけではなく1列にならんだ棒が全て透明になってしまいます。"AlphaData"は”ZData”と同じ 6面×4頂点=24個のデータで、各棒の頂点毎に透明度を設定出来ます。しかしながら、今回設定したい透明度は24点全て0か1と同じなので、元の入力データZを縦6個ずつ、横4個ずつに延ばして、z==0か否かで0か1に変換しました。
  1 Comment
Dai
Dai on 31 Jul 2022
大変よくわかりました。丁寧なご回答ありがとうございます。

Sign in to comment.

More Answers (0)

Products


Release

R2022a

Community Treasure Hunt

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

Start Hunting!