LoginSignup
2
0

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

Last updated at Posted at 2024-04-26

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

もぬ(@M3T1m) さんの X ポストを拝見したので試してみました。

まずは結果だけいうと

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);

figure_0.png

残念ながら 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;

figure_1.png

大きくなりました。

可読性?

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; % マーカーサイズ指定

figure_2.png

完成。

余談: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_3.png

白い・・。

背景色変更

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

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

figure_4.png

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

h_axes.XColor = 'white'; % 軸の色
h_axes.YColor = 'white'; % 軸の色
h_axes.Box = "on"; % 座標の右・上にも線をちゃんと描く設定

figure_5.png

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

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

figure_6.png

できました。

まとめ

素直に 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

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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0