Page 1 sur 1

[Résolu][Calc] Contrôle d'entrées de légende de graphique

Publié : 02 juil. 2019 10:36
par John9
Je voudrais avoir plus de contrôle sur les entrées de légende du graphique. C'est le script que j'utilise :

Code : Tout sélectionner

    Charts.addNewByName(chart_name, Rect, RangeAddress(), True, True)
    Chart = Charts.getByName(chart_name).EmbeddedObject
    Chart.Diagram = Chart.createInstance("com.sun.star.chart.LineDiagram")
    Chart.Diagram.DataRowSource = com.sun.star.chart.ChartDataRowSource.ROWS
    Chart.DataSourceLabelsInFirstColumn = [True or False]
    Chart.HasLegend = True
DataSourceLabelsInFirstColumn = True; takes the cells to the left of the data
DataSourceLabelsInFirstColumn = False; gives me 'row 2', 'row 3', etc as the legend entries

Comment puis-je changer les cellules cibles pour les entrées de légende ou prescrire le texte pour chaque ligne?

Merci!

Re: Contrôle des entrées de légende de graphique

Publié : 02 juil. 2019 12:16
par Bidouille
Cette section a des règles très précises que vous devez obligatoirement suivre pour obtenir de l'aide. C'est indiqué dans le cadre rouge en haut de la page.

Il est demandé aux auteurs de faire précéder le titre de leur question d'une balise adéquate. Ce balisage est extrêmement important car il permet d'avoir une base de connaissance optimum en cas de recherche. Avez-vous remarqué comment étaient les autres questions postées ?

Lisez ce fil pour savoir quelle balise utiliser : http://forum.openoffice.org/fr/forum/su ... html#27295

Nous l'avons fait pour vous cette fois-ci mais lors de votre prochaine question, nous vous remercions de le faire vous-même sous peine de voir votre sujet verrouillé.

Re: [Calc] Contrôle d'entrées de légende de graphique

Publié : 04 juil. 2019 06:41
par Dude
Déjà bonjour ?

Pour répondre, il faudrait avoir plus de matière.
Car 6 pauvres lignes de code n'aident en rien à la compréhension du problème.

Comme d'habitude et si tu as parcouru un tant soit peu ce forum, tu verras qu'il faut fournir :
  1. un document contenant un minimum de données
  2. une copie écran montrant l'effet attendu ou escompté
Une légende de graphique se base forcément sur une ligne ou une colonne de la plage de données.
Donc je ne comprends pas ton problème et ce à quoi tu veux arriver.

Re: [Calc] Contrôle d'entrées de légende de graphique

Publié : 04 juil. 2019 09:52
par John9
Il y a un exemple simplifié ci-jointe (Macro_simple.ods). Le macro est dans Macro_simple.ods->Standard->Module1 et ici :

Code : Tout sélectionner

Sub Plot_legend

Dim oDoc As Object, oSheet As Object, Dlg As Object

oDoc = ThisComponent
' Clear sheets
oSheet = oDoc.Sheets(1) ' Refers to Sheet1 as in 0, 1, 2 etc
oSheet.clearContents(1 OR 2 OR 4 OR 8 OR 16 OR 32 OR 64 OR 128 OR 256 OR 512)

Dim Charts As Object, Chart as Object
Dim Rect As New com.sun.star.awt.Rectangle
Dim RangeAddress(1) As New com.sun.star.table.CellRangeAddress

Rect.X = 500
Rect.Y = 500
Rect.Width = 10000
Rect.Height = 10000

RangeAddress(0).Sheet = 0
RangeAddress(0).StartColumn = 1
RangeAddress(0).StartRow = 3
RangeAddress(0).EndColumn = 12
RangeAddress(0).EndRow = 6

Charts = oDoc.Sheets(1).Charts

chart_name = "MyChart"
Charts.addNewByName(chart_name, Rect, RangeAddress(), True, True)
Chart = Charts.getByName(chart_name).EmbeddedObject
Chart.Diagram = Chart.createInstance("com.sun.star.chart.LineDiagram")
Chart.Diagram.DataRowSource = com.sun.star.chart.ChartDataRowSource.ROWS
'Chart.DataSourceLabelsInFirstColumn =  False ' change StartColumn = 2
Chart.HasLegend = True

' make legend entries 'first', 'second', 'third' from 'data' sheet

End Sub
Merci!

Re: [Calc] Contrôle d'entrées de légende de graphique

Publié : 04 juil. 2019 15:37
par Dude
Bis repetitae :
Dude a écrit :Une légende de graphique se base forcément sur une ligne ou une colonne de la plage de données.
De ce que je vois, c'est que ton graphique est mal conçu.
Donc, un contournement est de formater les cellules servant à la légende.

Re: [Calc] Contrôle d'entrées de légende de graphique

Publié : 26 juil. 2019 08:55
par John9
L'exemple donné est simplifié. J'ai actuellement plusieurs plots avec les mêmes entrées de légende, et je ai voulu directement référencer la même cellule...

J'ai trouvé la solution ici :

https://forum.openoffice.org/en/forum/v ... =20&t=8991

C'est plus général. On peut aussi choisir les différents séries pour x (très utile!).

Code : Tout sélectionner

REM  *****  BASIC  *****

Sub Plot_legend

Dim oDoc As Object, oSheet As Object, Dlg As Object

oDoc = ThisComponent
' Clear sheets
oSheet = oDoc.Sheets(1) ' Refers to Sheet1 as in 0, 1, 2 etc
oSheet.clearContents(1 OR 2 OR 4 OR 8 OR 16 OR 32 OR 64 OR 128 OR 256 OR 512)

Dim Charts As Object, Chart as Object
Dim Rect As New com.sun.star.awt.Rectangle
Dim RangeAddress(1) As New com.sun.star.table.CellRangeAddress

Rect.X = 500
Rect.Y = 500
Rect.Width = 10000
Rect.Height = 10000

RangeAddress(0).Sheet = 0
RangeAddress(0).StartColumn = 1
RangeAddress(0).StartRow = 3
RangeAddress(0).EndColumn = 12
RangeAddress(0).EndRow = 4

Charts = oDoc.Sheets(1).Charts

chart_name = "MyChart"
Charts.addNewByName(chart_name, Rect, RangeAddress(), True, True)
Chart = Charts.getByName(chart_name).EmbeddedObject
Chart.Diagram = Chart.createInstance("com.sun.star.chart.LineDiagram")
Chart.Diagram.DataRowSource = com.sun.star.chart.ChartDataRowSource.ROWS
'Chart.DataSourceLabelsInFirstColumn =  False ' change StartColumn = 2
Chart.HasLegend = True

'######## adding new series
oDataProvider = Chart.getDataProvider()
oDiagram = Chart.getFirstDiagram() ' chart2
oCooSys = oDiagram.getCoordinateSystems()
oCoods = oCooSys(0) ' this chart has only a coordinate system
 
oChartTypes = oCoods.getChartTypes() ' chart type one by one
oChartType = oChartTypes(0)
 
' all data series belongs the chart type
oDataSeriesList = oChartType.getDataSeries()

Dim oNewDataSeriesList(3) As Object ' new data series

Dim cols
cols = Array(17798, 16728590, 16765728, 5741852, 8257569, 8637183,_
  3227652, 11456256, 4923247, 16749838, 12910603, 34001)

DataSheet = oDoc.Sheets(0)

ns = 0
For ngc = 0 to 2
  ' x data range
  StartColumn = 2
  StartRow = 3
  EndColumn = 12
  EndRow = 3
  
  xcellr = DataSheet.getCellRangeByPosition(StartColumn,StartRow,EndColumn,EndRow)
  xrange_abs = xcellr.AbsoluteName
      
  ' y data range
  StartColumn = 2
  StartRow = 4 + ngc
  EndColumn = 12
  EndRow = 4 + ngc
  
  ycellr = DataSheet.getCellRangeByPosition(StartColumn,StartRow,EndColumn,EndRow)
  yrange_abs = ycellr.AbsoluteName

  ' label address
  clabel = DataSheet.getCellByPosition(0, 11 + ngc)
  label_abs = clabel.AbsoluteName
      
  oSeries = CreateDataSeries_XYDiagram(oDataProvider, _
    xrange_abs, yrange_abs, label_abs)
      
  ' set series properties see com.sun.star.chart2.DataSeries
  oSeries.Color = cols(ngc mod 12)
  oSeries.LineWidth = 80
  Select case ngc
  case Ng + Nextra ' all
    oSeries.LineStyle = com.sun.star.drawing.LineStyle.DASH
    oSeries.lineDashName = "Ultrafine Dashed"
  case 1
    oSeries.LineStyle = com.sun.star.drawing.LineStyle.DASH
    oSeries.lineDashName = "Fine Dashed"
  case 2
    oSeries.LineStyle = com.sun.star.drawing.LineStyle.DASH
    oSeries.lineDashName = "Fine Dotted"
  case 3
    oSeries.LineStyle = com.sun.star.drawing.LineStyle.DASH
    oSeries.lineDashName = "3 Dashes 3 Dots (var)"
  case 4
    oSeries.LineStyle = com.sun.star.drawing.LineStyle.DASH
    oSeries.lineDashName = "2 Dots 1 Dash"
  case 5
    oSeries.LineStyle = com.sun.star.drawing.LineStyle.DASH
    oSeries.lineDashName = "Fine Dashed (var)"
  end select
 
  oNewDataSeriesList(ns) = oSeries
  ns = ns + 1
Next
 
' update chart (only the charttype is updated)
oChartType.setDataSeries(oNewDataSeriesList)

End Sub

' 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")
 
  Dim oData(1) As Object ' x and y: .chart2.data.XLabeledDataSequence
 
  ' 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


' creat new DataSequence from range representaion
' that provides real data and its role in the series
' oDataProvider: com.sun.star.chart2.data.XDataProvider
' sRangeRepresentation: range address e.g. Sheet1.A1:B2
' sRole: role is defined in com.sun.star.chart2.data.DataSequenceRole
Function CreateDataSequence( _
    oDataProvider As Object, _
    sRangeRepresentation As String, sRole As String ) As Object
 
  Dim oDataSequence As Object
  On Error GoTo Handler
  ' create .chart2.data.DataSequence from range representation
  oDataSequence = oDataProvider._
      createDataSequenceByRangeRepresentation(sRangeRepresentation)
  If NOT IsNull(oDataSequence) Then
    oDataSequence.Role = sRole
  End If
 
  Handler:
    CreateDataSequence = oDataSequence
End Function