首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Openpyxl次要网格线

Openpyxl次要网格线
EN

Stack Overflow用户
提问于 2021-01-20 02:07:33
回答 1查看 373关注 0票数 1

我正在开发一个Python应用程序,我正在从设备上收集数据,并尝试使用Openpyxl库将其绘制到excel文件中。我成功地完成了所有工作,包括绘制数据和格式化我制作的散点图,但在向图中添加次要网格线时遇到了一些麻烦。

我觉得这绝对是可能的,因为在API中,我可以看到在openpyxl.chart.axis module下,有一个“minorGridlines”属性,但它不是一个布尔输入(开/关),而是一个图表线类。我试着往下走,看看我该如何做,但我想知道添加次要网格线的最直接方法是什么?您是否必须手动构建图表线,或者是否有一种简单的方法可以做到这一点?

如果有任何帮助,我将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2021-01-20 22:51:00

我想我已经回答了我自己的问题,但如果其他人需要的话,我会把它贴在这里(因为我在论坛上看不到这个问题的任何其他答案)。

示例代码(参见第4、38行):

代码语言:javascript
运行
复制
# Imports for script
from openpyxl import Workbook  # For plotting things in excel
from openpyxl.chart import ScatterChart, Reference, Series
from openpyxl.chart.axis import ChartLines
from math import log10

# Variables for script
fileName = 'testFile.xlsx'
dataPoints = 100

# Generating a workbook to test with
wb = Workbook()
ws = wb.active  # Fill data into the first sheet
ws_name = ws.title

# We will just generate a logarithmic plot, and scale the axis logarithmically (will look linear)
x_data = []
y_data = []
for i in range(dataPoints):
    x_data.append(i + 1)
    y_data.append(log10(i + 1))

# Go back through the data, and place the data into the sheet
ws['A1'] = 'x_data'
ws['B1'] = 'y_data'

for i in range(dataPoints):
    ws['A%d' % (i + 2)] = x_data[i]
    ws['B%d' % (i + 2)] = y_data[i]

# Generate a reference to the cells that we can plot
x_axis = Reference(ws, range_string='%s!A2:A%d' % (ws_name, dataPoints + 1))
y_axis = Reference(ws, range_string='%s!B2:B%d' % (ws_name, dataPoints + 1))
function = Series(xvalues=x_axis, values=y_axis)

# Actually create the scatter plot, and append all of the plots to it
ScatterPlot = ScatterChart()
ScatterPlot.x_axis.minorGridlines = ChartLines()

ScatterPlot.x_axis.scaling.logBase = 10
ScatterPlot.series.append(function)
ScatterPlot.x_axis.title = 'X_Data'
ScatterPlot.y_axis.title = 'Y_Data'
ScatterPlot.title = 'Openpyxl Plotting Test'
ws.add_chart(ScatterPlot, 'D2')

# Save the file at the end to output it
wb.save(fileName)

解决方案的背景:

我查看了Openpyxl的代码如何生成主轴网格线,它似乎遵循与次轴网格线类似的约定,我发现在‘NumericAxis’类中,它们生成了带有以下行的主网格线(标签为‘##### This line #####’,它最初是从‘openpyxl->chart-> axis’文件复制的):

代码语言:javascript
运行
复制
class NumericAxis(_BaseAxis):

tagname = "valAx"

axId = _BaseAxis.axId
scaling = _BaseAxis.scaling
delete = _BaseAxis.delete
axPos = _BaseAxis.axPos
majorGridlines = _BaseAxis.majorGridlines
minorGridlines = _BaseAxis.minorGridlines
title = _BaseAxis.title
numFmt = _BaseAxis.numFmt
majorTickMark = _BaseAxis.majorTickMark
minorTickMark = _BaseAxis.minorTickMark
tickLblPos = _BaseAxis.tickLblPos
spPr = _BaseAxis.spPr
txPr = _BaseAxis.txPr
crossAx = _BaseAxis.crossAx
crosses = _BaseAxis.crosses
crossesAt = _BaseAxis.crossesAt

crossBetween = NestedNoneSet(values=(['between', 'midCat']))
majorUnit = NestedFloat(allow_none=True)
minorUnit = NestedFloat(allow_none=True)
dispUnits = Typed(expected_type=DisplayUnitsLabelList, allow_none=True)
extLst = Typed(expected_type=ExtensionList, allow_none=True)

__elements__ = _BaseAxis.__elements__ + ('crossBetween', 'majorUnit',
                                         'minorUnit', 'dispUnits',)


def __init__(self,
             crossBetween=None,
             majorUnit=None,
             minorUnit=None,
             dispUnits=None,
             extLst=None,
             **kw
            ):
    self.crossBetween = crossBetween
    self.majorUnit = majorUnit
    self.minorUnit = minorUnit
    self.dispUnits = dispUnits
    kw.setdefault('majorGridlines', ChartLines()) ######## THIS Line #######
    kw.setdefault('axId', 100)
    kw.setdefault('crossAx', 10)
    super(NumericAxis, self).__init__(**kw)


@classmethod
def from_tree(cls, node):
    """
    Special case value axes with no gridlines
    """
    self = super(NumericAxis, cls).from_tree(node)
    gridlines = node.find("{%s}majorGridlines" % CHART_NS)
    if gridlines is None:
        self.majorGridlines = None
    return self

我尝试了一下,在导入‘Chartline’后,类如下所示:

代码语言:javascript
运行
复制
from openpyxl.chart.axis import ChartLines

我能够向x轴添加次要网格线,如下所示:

代码语言:javascript
运行
复制
ScatterPlot.x_axis.minorGridlines = ChartLines()

至于格式化次要的网格线,我有点迷茫,个人并不需要,但这至少是一个好的开始。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65797060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档