как мне присвоить имя диапазону данных в ряду данных?

#python #charts #legend #libreoffice #uno

#python #Диаграммы #легенда #libreoffice #uno

Вопрос:

Я создаю диаграмму с помощью скрипта python uno. Я добавил диапазон, категории, и мне удалось установить минимальные и максимальные значения для оси y.

Единственное, что я не могу сделать, это изменить «диапазон для имени».

Прямо сейчас на моей диаграмме отображается ‘Столбец AP’ для первого ряда данных и ‘Столбец AQ’ для второго ряда данных. Диаграмма выглядит следующим образом https://imgur.com/AFNHWw5 но я хочу, чтобы это выглядело как https://imgur.com/XUrMQ8e. Я хочу изменить легенды на «Купил» для первого ряда данных и «Сейчас» для второго.

Я попытался создать ряд данных, как описано вhttps://forum.openoffice.org/en/forum/viewtopic.php?f=20amp;t=8991#p46467 но не могу заставить его работать на python. https://forum.openoffice.org/en/forum/viewtopic.php?f=20amp;t=8991#p46467 кажется излишним, поскольку у меня есть все, кроме «диапазона для имени».

 def create_data_sequence(data_provider, ran, rol):
    data_sequence = data_provider.createDataSequenceByRangeRepresentation(ran)
    if data_sequence:
        data_sequence.Role = rol
    return data_sequence

# TODO: move to end when done
# https://forum.openoffice.org/en/forum/viewtopic.php?t=53750
# https://forum.openoffice.org/en/forum/viewtopic.php?f=44amp;t=55115
dashboard_sheet = sheets.getByName('DASHBOARD')
values_sheet = sheets.getByName('Values') # TODO: remove, because it's referenced later
charts = dashboard_sheet.getCharts()

rect = Rectangle()
rect.Width, rect.Height, rect.X, rect.Y = 22000, 12000, 1000, 9200

range_address = []
range_address.append(CellRangeAddress())

range_address[0].Sheet = values_sheet.RangeAddress.Sheet
range_address[0].StartColumn = 41
range_address[0].StartRow = 550
range_address[0].EndColumn = 42
range_address[0].EndRow = 807

charts.addNewByName("Total Value Over Time", rect , tuple(range_address), False, False)
chart = charts.getByName("Total Value Over Time").getEmbeddedObject()
chart.createInstance("com.sun.star.chart.LineDiagram")

data_provider = chart.getDataProvider()
categories_sequence = smgr.createInstanceWithContext(
                                        "com.sun.star.chart2.data.LabeledDataSequence", ctx)
categories_range = "$Values.$A$551:$A$808"
categories_sequence.setValues(create_data_sequence(data_provider,
                                                   categories_range, "categories"))

coordinate_system = chart.getFirstDiagram().getCoordinateSystems()[0]

x_axis = coordinate_system.getAxisByDimension(0, 0) # TODO : why chart.getFirstDiagram()?
y_axis = chart.getDiagram().YAxis                   # TODO : why chart.getDiagram()? diff?
scale_x_data = x_axis.getScaleData()
scale_x_data.Categories = categories_sequence
x_axis.setScaleData(scale_x_data)
y_axis.Min = 55000
y_axis.Max = 125000
y_axis.NumberFormat = number_format_id

chart.HasMainTitle = True
chart.HasLegend = True
chart.Title.String = "Total Value Over Time"
chart.Title.CharHeight = 24
chart.HasSubTitle = True
chart.SubTitle.String = "Funds and Structured Products"
chart.SubTitle.CharHeight = 12
  

На моей диаграмме показаны две строки. Я хочу, чтобы в легенде было указано «Куплено» для первой строки, «Сейчас» для второй.

Комментарии:

1. Одним из возможных решений, конечно, является выполнение следующего:

2. Похоже, вы никогда не заканчивали этот комментарий, или он был усечен.

3. действительно, моя ошибка, пожалуйста, игнорируйте ее.

Ответ №1:

Следующий код был адаптирован по ссылке в вашем вопросе. Не уверен, что это то, что вы имели в виду под «излишеством», но, похоже, это правильный способ установить метку.

 set_sequence_label(chart, 0, "bought")
set_sequence_label(chart, 1, "now")

def set_sequence_label(chart, series_index, label):
    data_series = chart.FirstDiagram.getCoordinateSystems()[0].getChartTypes(
        )[0].getDataSeries()[series_index]
    data_sequence = data_series.getDataSequences()[0]
    oSequenceLabel = (
        chart.getDataProvider().createDataSequenceByRangeRepresentation(label))
    data_sequence.setLabel(oSequenceLabel)
  

Документация: XLabeledDataSequence.setLabel().

Комментарии:

1. Спасибо! Это именно то, что я имел в виду. Нет, мое временное решение копирования — это перебор!