category name  »  page title date

円の散布図を描く

こんな散布図(というのかどうか)を描いてみようと思いました。
X、Yの組み合わせの頻度を、円の面積で示したものです。たとえばここでは、X(満足度)が3でY(重要度)も3の組み合わせが63件あった、ということを表しています。

こんなグラフを描く

もともとのデータは、ここに記載してあって、この例では500人の人の回答が掲載されています。某市での環境意識に関する市民アンケートの結果の一部です。

もとのデータ

これを読み取るために、XYの組み合わせの頻度を計算しました。
なんとなく傾向が見て取れそうですが、これでも確信がもてません。それで、この頻度をビジュアルに表現しようとしたのが最初の図です。

頻度を計算したデータ



やっていることは、単純なことですが、いろいろと自由度をもたせるために工夫しました。
左に掲げたのは、それぞれのワークシート内の "?" ボタンで表示される "Help" シートの内容です。

まず、X、Yの値は整数に限らず、それぞれ一定範囲を設定できるようにしました。その設定は、"RawData" シート内の "interval" で行います。

また、円の大きさ、縁の色と太さ、塗りつぶしの色と透明度、文字のフォントや大きさなどを自由にカスタマイズできるようにしました。
下の図は、カスタマイズするための "Const" シートの内容です。色やフォントはそれぞれのセルの内容を読み取ってグラフに反映させます。

個々の円を描画するための関数を下記に紹介しておきます。
DrawCircle x,y,radius で、座標 x、y の位置に、半径 radius の円を描きます。
この前に CircleWeigt、CircleColor、FillColor、FillTransparency を "Const" シートから取得して設定しておきます。
GraphShpes() は、描いた Shape の名前を格納しておく配列です。全体の描画が終わった時点で、一括してグループ化する際に用います。この変数も先行してどこかで定義しておきます。

標準モジュール        DrawCircle()

'---- 円を描く
'x,y は中心座標、radius は半径
Public Sub DrawCircle(x, y, radius)
      With GraphSheet.Shapes.AddShape(msoShapeOval, x - radius, y - radius, radius * 2, radius * 2)
            With .line
                  .Weight = CircleWeight
                  .ForeColor.RGB = CircleColor
            End With
            With .Fill
                  .ForeColor.RGB = FillColor
                  .Transparency = FillTransparency
                  .Visible = True
            End With
            GraphShapes(UBound(GraphShapes)) = .Name
      End With
      ReDim Preserve GraphShapes(UBound(GraphShapes) + 1)
End Sub