Top > OOoBasic > Calc > chart2 > XY

散布図 Edit

XY の複数の系列を保持できる散布図。

散布図テンプレート Edit

散布図関連のテンプレートサービス名は以下のものです。

名称種類
com.sun.star.chart2.template.ScatterLineラインのみ
com.sun.star.chart2.template.ScatterLineSymbolラインとデータ点
com.sun.star.chart2.template.ScatterSymbolデータ点
com.sun.star.chart2.template.ThreeDScatter3D

系列 Edit

X が異なる多数の系列を保持できます。

各系列のデータシークエンスには次の Role を指定したデータが使用できます。

  • label: 系列のラベル
  • values-x : X データ
  • values-y: Y データ ラベルは凡例などにも使用されます。

系列を作成する Edit

散布図用の系列を作成します。

values-x のデータシークエンスと values-y のデータシークエンスを用意してそれぞれを LabeledDataSequence に設定します。このとき、y の LabeledDataSequence の Label にラベル用のデータシークエンスを設定しておいて系列のラベルとします。 x と y の LabeledDataSequence をまとめてデータ系列に設定して新しい系列とします。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
' create new series for XYDiagram
' a series has two or more LabeledDataSequence that is named by Label DataSequence.
' oDataProvider: com.sun.star.chart2.data.XDataProvider
' sXRangeRepresentation: X
' sYRangeRepresentation: Y
' sLabelRangeRepresentation: range representation for name of the series
Function CreateDataSeries_XYDiagram( _
    oDataProvider As Object, _
    sXRangeRepresentation As String, _
    sYRangeRepresentation As String, _
    Optional sLabelRangeRepresentation As String ) As Object
  
  Dim oNewDataSeries As Object
  ' create new DataSeries
  oNewDataSeries = CreateUnoService("com.sun.star.chart2.DataSeries")
  
  ' Y
  oDataY = CreateUnoService("com.sun.star.chart2.data.LabeledDataSequence")
  oSequenceY = CreateDataSequence(oDataProvider, _
      sYRangeRepresentation, "values-y")
  If NOT IsNull(oSequenceY) Then
    oDataY.setValues(oSequenceY)
  
    If NOT ((IsMissing(sLabelRangeRepresentation)) AND _
                      (sLabelRangeRepresentation <> "")) Then
      oSequenceLabel = CreateDataSequence(oDataProvider, _
        sLabelRangeRepresentation, "")
      oDataY.setLabel(oSequenceLabel) ' label is used as name
    End If
  End If
  
  ' X
  oDataX = CreateUnoService("com.sun.star.chart2.data.LabeledDataSequence")
  oSequenceX = CreateDataSequence(oDataProvider, _
      sXRangeRepresentation, "values-x")
  If NOT IsNull(oSequenceX) Then
    oDataX.setValues(oSequenceX)
  End If
  
  ' set x and y data to series
  aData = Array(oDataY, oDataX)
  oNewDataSeries.setData(aData)
  
  CreateDataSeries_XYDiagram = oNewDataSeries
End Function

Edit

散布図を作成する例。

多系列を使用する Edit

多系列の散布図を描きます。

二つの系列は次のデータ範囲を使用します。

  • X1: Sheet2.A3:A7, Y1: Sheet2.B3:B7, Label1: Sheet2.A1
  • X2: Sheet2.D3:D7, Y2: Sheet2.E3:E7, Label2: Sheet2.D1

お勧めの作成手順

  1. まず、ひとつだけの系列を持ったチャートが出来るように普通にチャートを挿入
  2. 最初にある系列を無視して全ての系列を作成しなおす
  3. 系列のプロパティを設定 (設定を変更しないと全て同じ色で描かれます)
  4. 系列を変更する
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
Sub xydiagram_ex1
  oDoc = ThisComponent
  oCharts = oDoc.getSheets().getByIndex(1).getCharts()
  
  Dim aRange(1) As New com.sun.star.table.CellRangeAddress
  Dim aRectangle As New com.sun.star.awt.Rectangle
  
  sChartName = "Chart10"
  aRange(0) = make_CellRangeAddress(1, 0, 0, 2, 6)
  aRange(1) = make_CellRangeAddress(1, 1, 1, 2, 6)
  
  aRectangle = make_Rectangle(1300, 11300, 7000, 5000)
 
  If NOT oCharts.hasByName(sChartName) Then
    ' add new chart
    oCharts.addNewByName( _
        sChartName, aRectangle, aRange, False, False)
    
    'oChartObj = oCharts.getByName(sChartName)
    oChart = oCharts.getByName(sChartName).getEmbeddedObject()
    
    'oChart.setDiagram( _
    '    oChart.createInstance("com.sun.star.chart.XYDiagram"))
    oDiagram = oChart.getFirstDiagram()
    
    ' change diagram type
    oChartTypeManager = oChart.getChartTypeManager()
    oChartTypeTemplate = oChartTypeManager.createInstance( _
        "com.sun.star.chart2.template.ScatterLineSymbol")
    oChartTypeTemplate.changeDiagram(oDiagram)
 
    ' get coordinate system
    oCooSyss = oDiagram.getCoordinateSystems()
    If UBound(oCooSyss) < 0 Then Exit Sub
    oCooSys = oCooSyss(0)
    
    ' get chart type
    oChartTypes = oCooSys.getChartTypes()
    If UBound(oChartTypes) < 0 Then Exit Sub
    oChartType = oChartTypes(0)
    
    oDataProvider = oChart.getDataProvider()
    oColorScheme = oDiagram.getDefaultColorScheme()
    
    
    ' for creation of representation of dataranges
    oSheetCellRanges = oDoc.createInstance( _
        "com.sun.star.sheet.SheetCellRanges")
    
    ' 以下系列作成
    ' create range representations
    sRange1_X = GetRangeAddressAsString(oSheetCellRanges, _
        1, 0, 0, 2, 6 )
    sRange1_Y = GetRangeAddressAsString(oSheetCellRanges, _
        1, 1, 1, 2, 6 )
    sRange1_Label = GetRangeAddressAsString(oSheetCellRanges, _
        1, 0, 0, 0, 0 )
    
    sRange2_X = GetRangeAddressAsString(oSheetCellRanges, _
        1, 3, 3, 2, 6 )
    sRange2_Y = GetRangeAddressAsString(oSheetCellRanges, _
        1, 4, 4, 2, 6 )
    sRange2_Label = GetRangeAddressAsString(oSheetCellRanges, _
        1, 3, 3, 0, 0 )
    
    ' creat series
    oSeries1 = CreateDataSeries_XYDiagram( _
      oDataProvider, sRange1_X, sRange1_Y, sRange1_Label )
    oSeries2 = CreateDataSeries_XYDiagram( _
      oDataProvider, sRange2_X, sRange2_Y, sRange2_Label )
    
    ' set propreties
    
    ' line colors taken from DefaultColorScheme
    oSeries1.Color = oColorScheme.getColorByIndex(0)
    oSeries2.Color = oColorScheme.getColorByIndex(1)
    
    ' symbol description
    aSymbol = CreateUnoStruct("com.sun.star.chart2.Symbol")
    aSymbol.Style = com.sun.star.chart2.SymbolStyle.STANDARD
    aSymbol.Size = make_Size(250, 250)
    
    oSeries1.Symbol = aSymbol
    oSeries2.Symbol = aSymbol
    
    oNewDataSeriesList = Array(oSeries1, oSeries2)
    ' update with new []DataSeries
    oChartType.setDataSeries(oNewDataSeriesList)
  End If
End Sub

CreateDataSeries_XYDiagram は上記系列を作成する参照。

下記のものも使用します。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
Function make_Size( _
    nWidth As Long, nHeight As Long ) As com.sun.star.awt.Size
  Dim aSize As New com.sun.star.awt.Size
  aSize.Width = nWidth
  aSize.Height = nHeight
  make_Size = aSize
End Function
 
 
Function GetRangeAddressAsString( _
    oSheetCellRanges As Object, _
    nSheet As Integer, _
    nStartColumn As Long, nEndColumn As Long, _
    nStartRow As Long, nEndRow As Long  ) As String
  
  Dim sRangeRepresentation As String
  Dim aRangeAddress As Object
  aRangeAddress = make_CellRangeAddress( _
      nSheet, nStartColumn, nEndColumn, _
      nStartRow, nEndRow )
  
  With oSheetCellRanges
    .addRangeAddress(aRangeAddress, False)
    sRangeRepresentation = .getRangeAddressesAsString()
    .removeRangeAddress(aRangeAddress)
  End With
  
  GetRangeAddressAsString = sRangeRepresentation
End Function

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes