Top > OOoBasic > Calc > chart2 > XY
* 散布図 [#u985bde7]

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

#contents

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

|名称|種類|h
|com.sun.star.chart2.template.ScatterLine|ラインのみ|
|com.sun.star.chart2.template.ScatterLineSymbol|ラインとデータ点|
|com.sun.star.chart2.template.ScatterSymbol|データ点|
|com.sun.star.chart2.template.ThreeDScatter|3D|
** 系列 [#p2da31e9]
X が異なる多数の系列を保持できます。

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

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

** 系列を作成する [#c333538c]
散布図用の系列を作成します。

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

#code(ob){{
' 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
}}
** 例 [#hb31cf73]
散布図を作成する例。

*** 多系列を使用する [#h10e8612]
多系列の散布図を描きます。

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

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

お勧めの作成手順
+ まず、ひとつだけの系列を持ったチャートが出来るように普通にチャートを挿入
+ 最初にある系列を無視して全ての系列を作成しなおす
+ 系列のプロパティを設定 (設定を変更しないと全て同じ色で描かれます)
+ 系列を変更する

#code(ob){{
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 は上記[[系列を作成する>#c333538c]]参照。

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

#code(ob){{
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