Настраивает объекты ChartLines в openpyxl

Я использую openpyxl для построения графика, но у меня возникли проблемы с настройкой линий сетки.

Пример (упрощенный) кода

# Import 
from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference
from openpyxl.chart.axis import ChartLines, TextAxis
from openpyxl.chart.shapes import GraphicalProperties
from openpyxl.drawing.colors import ColorChoice

# Create a line chart
chart = LineChart()

# Reference data from the worksheet I'm working with
num_rows = ws_data.max_row
num_cols = ws_data.max_column
data_ref = Reference(ws_data, min_col=2, min_row=1, max_col=num_cols, max_row=num_rows)
chart.add_data(data_ref, titles_from_data=True)

# Configure the x_axis
chart.x_axis = TextAxis(tickMarkSkip=4)
chart.x_axis.majorTickMark = "cross"
chart.x_axis.delete = False

# Configure the vertical gridlines
chart.x_axis.majorGridlines = ChartLines()
chart.x_axis.majorGridlines.graphicalProperties = GraphicalProperties(noFill=False, solidFill=ColorChoice(prstClr='yellow'))

# Add the chart to the 'Charts' worksheet
ws_chart.add_chart(chart, "A1")

Результатом этого фрагмента кода является то, что вертикальные линии сетки видны через каждые 4 деления, как я и предполагал. Однако цвет неправильный. Я также пробую еще несколько вещей, но, похоже, я не могу ничего сделать, чтобы манипулировать графическими свойствами объектов ChartLines().

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы настроить линии сетки и правильно установить их свойства в openpyxl, вам необходимо убедиться, что вы используете соответствующие свойства и методы. Работа с классом GraphicalProperties может быть немного сложной, особенно при настройке цветов.

Вот исправленная версия вашего кода, обеспечивающая правильную настройку линий сетки и желаемый цвет:

 # Import necessary modules
from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference
from openpyxl.chart.axis import ChartLines, TextAxis
from openpyxl.drawing.line import LineProperties
from openpyxl.drawing.colors import ColorChoice
from openpyxl.chart.shapes import GraphicalProperties

# Create a workbook and add a worksheet
wb = Workbook()
ws_data = wb.active
ws_data.title = "Data"

# Add some example data
data = [
    ["Month", "Value"],
    [1, 10],
    [2, 40],
    [3, 30],
    [4, 50],
    [5, 20],
    [6, 60],
    [7, 70]
]

for row in data:
    ws_data.append(row)

# Create a 'Charts' worksheet
ws_chart = wb.create_sheet(title = "Charts")

# Create a line chart
chart = LineChart()

# Reference data from the worksheet
num_rows = ws_data.max_row
num_cols = ws_data.max_column
data_ref = Reference(ws_data, min_col=2, min_row=2, max_col=num_cols, max_row=num_rows)
chart.add_data(data_ref, titles_from_data=True)

# Configure the x_axis
chart.x_axis = TextAxis(tickMarkSkip=1)
chart.x_axis.majorTickMark = "cross"
chart.x_axis.delete = False

# Configure the vertical gridlines
chart.x_axis.majorGridlines = ChartLines()
chart.x_axis.majorGridlines.spPr = GraphicalProperties(ln=LineProperties(solidFill=ColorChoice(prstClr='yellow')))

# Add the chart to the 'Charts' worksheet
ws_chart.add_chart(chart, "A1")

# Save the workbook
wb.save("chart_with_gridlines.xlsx")

В этом пересмотренном коде ключевой частью является правильная настройка LineProperties:

chart.x_axis.majorGridlines.spPr = GraphicalProperties(ln=LineProperties(solidFill=ColorChoice(prstClr='yellow')))

Это гарантирует, что линии сетки правильно настроены и имеют желаемый цвет. Убедитесь, что ваша версия openpyxl поддерживает эти функции, поскольку некоторые функции могут различаться в разных версиях. Если у вас возникнут какие-либо проблемы, убедитесь, что у вас установлена ​​последняя версия openpyxl:

pip install openpyxl --upgrade

Спасибо за помощь. Но я получил ошибку в строкеchart.x_axis.majorGridlines.spPr: TypeError: <class 'openpyxl.chart.axis.ChartLines'>.spPr должен быть <class 'openpyxl.chart.shapes.GraphicalProperties'>, но значение < класс 'openpyxl.drawing.line.LineProperties'>. Вот почему я установил эту строку так, как в своем коде. Код выполняется, но эффект не применяется.

ensbana 04.08.2024 03:38

Эй, я действительно нашел ответ! Правильная строка должна выглядеть так:chart.x_axis.majorGridlines.spPr = GraphicalProperties(ln=LineProperties(solidFill=ColorChoice(‌​prstClr='yellow'))). Я не знаю, что делает GraphicalProperties(noFill=False, SolidFill=ColorChoice(prstClr='yellow')). Но я рад, что нашел ваш ответ!

ensbana 04.08.2024 03:47

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

ensbana 04.08.2024 04:09

Рад слышать! Строка GraphicalProperties(noFill=False, SolidFill=ColorChoice(prstClr='yellow')) неверна, поскольку GraphicalProperties напрямую не принимает noFill или SolidFill в качестве параметров. Вместо этого следует использовать GraphicalProperties для переноса LineProperties. Я обновил ответ

testsonic_T 04.08.2024 18:00

Другие вопросы по теме