[LibreOffice/OpenOffice Basic] 実用例 (2) グラフを自動的に描く

本ページは「Excel で学ぶ Visual Basic for Applications (VBA)」内のページ
実用例 (2) グラフを自動的に描く」を LibreOffice/OpenOffice Basic に対応させたものである。

ここまでの例で、LibreOffice/OpenOffice Basic からシートにデータを出力する方法を学んで来たが、
データを出力するだけではなくグラフまで LibreOffice/OpenOffice Basic で自動的に描けると楽である。

ここでは、理系ではしばしば用いる「散布図」のグラフを LibreOffice/OpenOffice Basic で描く方法を 紹介する。

高校数学からはじめるディープラーニング 表紙 Excel / OpenOffice で学ぶフーリエ変換入門 表紙 本章で解説するグラフ表示方法を用いた 「高校数学からはじめるディープラーニング」および
Excel / OpenOffice で学ぶフーリエ変換入門」では
マクロをソース閲覧可能な形で用いています。



プログラムを書き始めるまでの準備」を参考に以下の LibreOffice/OpenOffice Basic プログラムを記入して実行しよう。
以下のように「x, Sin(x), Cos(x)」の 3 列の表が現れ、そのグラフが現れる。





Sub draw_data()
    Dim N As Long, i As Long
    Dim x As Double, dx As Double

    N = 100
    x = 0
    dx = 3.14 * 2 / N

    ' データ作成部
    ThisComponent.addActionLock()

    ' グラフが存在する場合、ロックをかけないとセル記入が遅くなる    
    If ThisComponent.Sheets(0).Charts.hasByName("datagraph") = True Then
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.LockControllers
    End If
    
    For i = 0 To N - 1
        ThisComponent.Sheets(0).getCellByPosition(0, i).Value  = x
        ThisComponent.Sheets(0).getCellByPosition(1, i).Value  = Sin(x)
        ThisComponent.Sheets(0).getCellByPosition(2, i).Value  = Cos(x)
        x = x + dx
    Next i

    If ThisComponent.Sheets(0).Charts.hasByName("datagraph") = True Then
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.LockControllers
    End If
    
    ThisComponent.removeActionLock()
    
    Dim Rect As New com.sun.star.awt.Rectangle 
    Dim RangeAddress(0) As New com.sun.star.table.CellRangeAddress

    ' グラフが存在しなければ描画する
    If ThisComponent.Sheets(0).Charts.hasByName("datagraph") = False Then

        ' グラフ位置
        Rect.X = 8000 
        Rect.Y = 1000
        ' グラフサイズ
        Rect.Width = 10000 
        Rect.Height = 7000

        ' シートの範囲(配列の要素数を増やしてそれぞれ設定すると、離れた列のグラフが描ける)
        RangeAddress(0).Sheet = 0 
        RangeAddress(0).StartColumn = 0 
        RangeAddress(0).StartRow = 0 
        RangeAddress(0).EndColumn = 2
        RangeAddress(0).EndRow = N - 1

        ' 一つ目の False を True にすると、一行目を各系列名とするようになる。
        ' 二つ目の False を True にすると一列目が各系列名となるらしい
        ThisComponent.Sheets(0).Charts.addNewByName("datagraph", Rect, RangeAddress(), False, False)
		
        ' ここでグラフをロックしておくと後の処理が高速
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.LockControllers
		
        ' 各系列の名前(凡例に用いられる)
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject().Data.setColumnDescriptions(Array("x","sin(x)","cos(x)")
 
        ' 散布図を選択
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram _
                = ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.createInstance("com.sun.star.chart.XYDiagram")

        ' データポイントなし
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.SymbolType =-3  ' no points
		
        ' 一本目の系列(sin(x))を青にして太く
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.getDataRowProperties(1).LineColor = RGB(0,0,255)
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.getDataRowProperties(1).LineWidth = 50

        ' 二本目の系列(cos(x))を赤にして太く
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.getDataRowProperties(2).LineColor = RGB(255,0,0)
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.getDataRowProperties(2).LineWidth = 50

        ' x 軸のスケール設定
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.XAxis.AutoMin  = False
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.XAxis.Min  = 0
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.XAxis.AutoMax  = False
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.XAxis.Max  = 6.28
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.XAxis.AutoStepMain  = False
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.XAxis.StepMain  = 1.57

        ' x 軸のラベル設定
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.HasXAxisTitle = True
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.XAxisTitle.String ="x"
		
        ' y 軸のラベル設定
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.HasYAxisTitle = True
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Diagram.YAxisTitle.String ="y"
	
        ' グラフタイトル設定
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.HasMainTitle = True
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Title.String ="y=sin(x) と y=cos(x) のグラフ"
		
        ' 凡例を下に
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.HasLegend = True
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.Legend.Alignment = com.sun.star.chart.ChartLegendPosition.BOTTOM
		
        ' ロック解除
        ThisComponent.Sheets(0).Charts.getByName("datagraph").embeddedObject.UnLockControllers
    End If
End Sub




←[LibreOffice/OpenOffice Basic] 実用例 (1) 飛び飛びのセルのデータを抜き出す (間引きする)

Excel で学ぶ Visual Basic for Applications (VBA)に戻る