MATLAB 本体の scatter 関数ではなく、Commnunication Toolbox の scatterplot 関数。
もぬ(@M3T1m) さんの X ポストを拝見したので試してみました。
MATLABのscatterplotのマーカーのサイズって大きくすることできないのかな?
— もぬ (@M3T1m) April 25, 2024
まずは結果だけいうと
d = (0:63)';
s = qammod(d,64);
h_fig = scatterplot(s);
h_line = findobj(h_fig,'Type','Line');
h_line.MarkerSize = 20; % マーカーサイズ指定
でOKです。
- 作業環境:MATLAB R2024a
- Communication Toolbox (scatterplot を使用する場合)
以下、背景説明
Communciation Toolbox に scatterplot(IQ 平面における入力信号の表示)という関数があります。細かいところはともかく散布図を表示するんですが、マーカーサイズが確かに控えめサイズ。これを大きくしたい。
d = (0:63)';
s = qammod(d,64);
h_fig = scatterplot(s);
残念ながら R2024a 時点では関数実行時の設定でマーカーサイズの変更ができませんので、出てきた Figure 内から散布図のマーカーサイズに当たる object のプロパティを探し出してみます。
Documentation にも
" scatfig
を使用して、作成後に Figure のプロパティをクエリまたは変更します。"
との記載があり、必要があれば散布図作った後に変更してね、という意図が見られます(?)
やったこと
まずは Figure オブジェクトを見てみます。
h_fig
h_fig =
Figure (Scatter Plot) with properties:
Number: 1
Name: 'Scatter Plot'
Color: [0 0 0]
Position: [440 278 420 420]
Units: 'pixels'
Show all properties
マーカーサイズなので、Figure のプロパティじゃなくて、おそらく子オブジェクト内だろう。子オブジェクトを見ると、
h_fig.Children
ans =
2x1 graphics array:
Legend (Channel 1)
Axes (Scatter plot)
2つある。通常座標軸(Axes オブジェクト)の上に色々載せるので、Axes オブジェクトの子オブジェクト見てみます。
h_fig.Children(2).Children
ans =
Line (Channel 1) with properties:
Color: [1 1 0]
LineStyle: 'none'
LineWidth: 0.5000
Marker: '.'
MarkerSize: 6
MarkerFaceColor: 'none'
XData: [-7 -7 -7 -7 -7 -7 -7 -7 -5 -5 -5 -5 -5 -5 -5 -5 -1 -1 -1 -1 -1 -1 -1 -1 -3 -3 -3 -3 -3 -3 -3 -3 7 7 7 7 7 7 7 7 5 5 5 5 5 5 5 5 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3]
YData: [7 5 1 3 -7 -5 -1 -3 7 5 1 3 -7 -5 -1 -3 7 5 1 3 -7 -5 -1 -3 7 5 1 3 -7 -5 -1 -3 7 5 1 3 -7 -5 -1 -3 7 5 1 3 -7 -5 -1 -3 7 5 1 3 -7 -5 -1 -3 7 5 1 3 -7 -5 -1 -3]
Show all properties
マーカーサイズ(MarkerSize)ありましたね。この Line オブジェクトで散布図の点を表しているようだ。
h_fig.Children(2).Children.MarkerSize = 30;
大きくなりました。
可読性?
h_fig.Children(2).Children.MarkerSize = 30;
だと可読性が悪い(=カッコ悪い)ので、findobj 関数で該当オブジェクトを取り出す方法でいきたいと思います。
オブジェクトを探し出すときは大体 'Type'
で検索してきました。該当オブジェクトの Type
は
h_fig.Children(2).Children.Type
ans = 'line'
'line'
だそうです。Figure の中から 'Type'
が 'line'
であるオブジェクトを探せばよさそう。
h_line = findobj(h_fig,'Type','Line');
h_line.MarkerSize = 20; % マーカーサイズ指定
完成。
余談:Scatter 関数で再現できない?
MATLAB 本体の scatter 関数だとマーカーサイズの指定が関数実行時にできるので、こちらを使って↑と同じ見た目のプロットを描くことも考えてみます。
データはなんでもいいので、取りあえず上で作ったプロットから取っておきます。
xData = h_line.XData;
yData = h_line.YData;
scatter 関数でそのまま表示するとこんな感じ。40 の部分がマーカーサイズを設定しているところです。
h_fig2 = figure;
scatter(xData,yData,40,'yellow','filled')
title("Scatter Plot")
xlabel("In-Phase")
ylabel("Quadrature")
白い・・。
背景色変更
背景色は Figure オブジェクトの Color で OK ですが、これだけだと座標軸(Axes オブジェクト)の背景が白いままになっちゃうので、Axes の Color プロパティを 'none' に設定('black' でも OK)します。以前書いた「今年暖かすぎません?地球の平均気温を可視化 1880年〜2023 年」でも同じことをやりました。
h_fig2.Color = 'black';
h_axes = gca;
h_axes.Color = 'none';
これでOKと思いきや、軸が見えない。こちらも色を変えておきます。
h_axes.XColor = 'white'; % 軸の色
h_axes.YColor = 'white'; % 軸の色
h_axes.Box = "on"; % 座標の右・上にも線をちゃんと描く設定
黒で書いちゃっているのでタイトルが見えない。白文字に変えます。(軸ラベルは軸そのものの色と同期していますね)
title('Scatter plot',Color='white')
grid on % ついでにグリッド線も描いておきます。
できました。
まとめ
素直に scatterplot 関数で出てきた Figure を調整する場合は、
d = (0:63)';
s = qammod(d,64);
h_fig = scatterplot(s);
h_line = findobj(h_fig,'Type','Line');
h_line.MarkerSize = 20; % マーカーサイズ指定
scatter 関数で同じようなプロットを再現する場合は
scatter(xData,yData,40,'yellow','filled')
h_figure = gcf;
h_figure.Color = 'black';
h_axes = gca;
h_axes.Color = 'none';
h_axes.XColor = 'white'; % 軸の色
h_axes.YColor = 'white'; % 軸の色
h_axes.Box = "on";
title('Scatter plot',Color='white')
grid on
という結果になりました。