scatterplot のマーカーサイズを変更したい（scatter じゃない方）

MATLAB 本体の scatter 関数ではなく、Commnunication Toolbox の scatterplot 関数。

もぬ[(@M3T1m)](https://twitter.com/M3T1m) さんの X ポストを拝見したので試してみました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">MATLABのscatterplotのマーカーのサイズって大きくすることできないのかな？</p>&mdash; もぬ (@M3T1m) <a href="https://twitter.com/M3T1m/status/1783428452508692503?ref_src=twsrc%5Etfw">April 25, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

まずは結果だけいうと

```matlab
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 平面における入力信号の表示）](https://jp.mathworks.com/help/comm/ref/scatterplot.html)という関数があります。細かいところはともかく散布図を表示するんですが、マーカーサイズが確かに控えめサイズ。これを大きくしたい。

```matlab
d = (0:63)';
s = qammod(d,64);
h_fig = scatterplot(s);
```

![figure_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/6744cae8-ae68-84dd-76f8-6f9ad697d969.png)


残念ながら R2024a 時点では関数実行時の設定でマーカーサイズの変更ができませんので、出てきた Figure 内から散布図のマーカーサイズに当たる object のプロパティを探し出してみます。


Documentation にも


 *"* *`scatfig`* *を使用して、作成後に Figure のプロパティをクエリまたは変更します。"* 


との記載があり、必要があれば散布図作った後に変更してね、という意図が見られます（？）

## やったこと

まずは Figure オブジェクトを見てみます。

```matlab
h_fig
```

```matlabTextOutput
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 のプロパティじゃなくて、おそらく子オブジェクト内だろう。子オブジェクトを見ると、

```matlab
h_fig.Children
```

```matlabTextOutput
ans = 
  2x1 graphics array:

  Legend    (Channel 1)
  Axes      (Scatter plot)

```

2つある。通常座標軸（Axes オブジェクト）の上に色々載せるので、Axes オブジェクトの子オブジェクト見てみます。

```matlab
h_fig.Children(2).Children
```

```matlabTextOutput
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 オブジェクトで散布図の点を表しているようだ。

```matlab
h_fig.Children(2).Children.MarkerSize = 30;
```

![figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/9ac024a1-8e1f-7abe-4019-07ee8765b364.png)

大きくなりました。

## 可読性？
```
h_fig.Children(2).Children.MarkerSize = 30;
```

だと可読性が悪い（＝カッコ悪い）ので、findobj 関数で該当オブジェクトを取り出す方法でいきたいと思います。


オブジェクトを探し出すときは大体 `'Type'` で検索してきました。該当オブジェクトの `Type` は

```matlab
h_fig.Children(2).Children.Type
```

```matlabTextOutput
ans = 'line'
```

`'line'` だそうです。Figure の中から `'Type'` が `'line'` であるオブジェクトを探せばよさそう。

```matlab
h_line = findobj(h_fig,'Type','Line');
h_line.MarkerSize = 20; % マーカーサイズ指定
```

![figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/26f10e93-687d-7674-c600-e33043bba60d.png)

完成。

# 余談：Scatter 関数で再現できない？

MATLAB 本体の scatter 関数だとマーカーサイズの指定が関数実行時にできるので、こちらを使って↑と同じ見た目のプロットを描くことも考えてみます。


データはなんでもいいので、取りあえず上で作ったプロットから取っておきます。

```matlab
xData = h_line.XData;
yData = h_line.YData;
```

scatter 関数でそのまま表示するとこんな感じ。40 の部分がマーカーサイズを設定しているところです。

```matlab
h_fig2 = figure;
scatter(xData,yData,40,'yellow','filled')
title("Scatter Plot")
xlabel("In-Phase")
ylabel("Quadrature")
```

![figure_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/a4a78772-30f5-8288-fea9-21768ec84992.png)

白い・・。

## 背景色変更

背景色は Figure オブジェクトの Color で OK ですが、これだけだと座標軸（Axes オブジェクト）の背景が白いままになっちゃうので、Axes の Color プロパティを 'none' に設定（'black' でも OK）します。以前書いた「[今年暖かすぎません？地球の平均気温を可視化 1880年〜2023 年](https://qiita.com/eigs/items/2729e30e765c7c719f41)」でも同じことをやりました。

```matlab
h_fig2.Color = 'black';
h_axes = gca;
h_axes.Color = 'none';
```

![figure_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/2db3142c-3342-380c-fe43-3066e3de9ee8.png)

これでOKと思いきや、軸が見えない。こちらも色を変えておきます。

```matlab
h_axes.XColor = 'white'; % 軸の色
h_axes.YColor = 'white'; % 軸の色
h_axes.Box = "on"; % 座標の右・上にも線をちゃんと描く設定
```
![figure_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/2255ed08-b13c-eef0-1b97-c127f228a7a8.png)


黒で書いちゃっているのでタイトルが見えない。白文字に変えます。（軸ラベルは軸そのものの色と同期していますね）

```matlab
title('Scatter plot',Color='white')
grid on % ついでにグリッド線も描いておきます。
```

![figure_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149511/14a32e7f-e9a5-91fa-d5f6-0aa5240de544.png)

できました。

# まとめ

素直に scatterplot 関数で出てきた Figure を調整する場合は、

```matlab
d = (0:63)';
s = qammod(d,64);
h_fig = scatterplot(s);

h_line = findobj(h_fig,'Type','Line');
h_line.MarkerSize = 20; % マーカーサイズ指定
```

scatter 関数で同じようなプロットを再現する場合は

```matlab
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
```

という結果になりました。