如何为数据系列中的数据范围命名?

Posted

技术标签:

【中文标题】如何为数据系列中的数据范围命名?【英文标题】:how do I give a name to a data range in a data series? 【发布时间】:2019-09-12 16:08:16 【问题描述】:

我正在通过 python uno 脚本创建图表。我添加了一个范围、类别,并设法为 y 轴设置了最小值和最大值。

我唯一不能这样做的是更改“名称范围”。

现在我的图表显示第一个数据系列的“AP 列”和第二个数据系列的“AQ 列”。该图表看起来像https://imgur.com/AFNHWw5,但我希望它看起来像https://imgur.com/XUrMQ8e。我想将第一个数据系列的图例更改为“已购买”,将第二个数据系列更改为“现在”。

我尝试按照https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=8991#p46467 中的描述创建一个数据系列,但无法让它在 python 中工作。 https://forum.openoffice.org/en/forum/viewtopic.php?f=20&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=44&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】:

以下代码改编自您问题中的链接。不确定这是否是您所说的“矫枉过正”,但这似乎是设置标签的正确方法。

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()。

【讨论】:

谢谢!这正是我的意思。不,我复制的临时解决方案是矫枉过正!

以上是关于如何为数据系列中的数据范围命名?的主要内容,如果未能解决你的问题,请参考以下文章

python数据结构-如何为元组中的每个元素命名

如何为 .NET Core 重命名 ABP 中的列?

你如何为ggplot中的条形图在x轴上做范围?

如何为列中的每个唯一值获取数据框中的项目数[重复]

如何为熊猫中的多个变量按列创建所有组合?

如何为 Webpack 中的每个入口点重命名 output.library 选项?