график рассеяния xy с python -pptx не работает - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь создать простую диаграмму разброса python -pptx xy с данными серии x и y, но пока безуспешно.

from pptx import Presentation
from pptx.util import Inches,Pt

from pptx.enum.chart import XL_CHART_TYPE
from pptx.chart.data import XySeriesData

prs = Presentation()
title_slide_layout = prs.slide_layouts[0]
blank_slide_layout = prs.slide_layouts[6]

slide = prs.slides.add_slide(title_slide_layout)
slide2 = prs.slides.add_slide(blank_slide_layout)

title = slide.shapes.title
subtitle = slide.placeholders[1]

title.text = "Hello, World!"
subtitle.text = "python-pptx was here!"
chart_data = XySeriesData
chart_data.x_values=[0,1,2,3,4,5]
chart_data.y_values=[10,22,33,38,40,43]
x, y, cx, cy = Inches(1), Inches(2), Inches(8), Inches(3)
chart = slide2.shapes.add_chart(XL_CHART_TYPE.XY_SCATTER, x, y, cx, cy, chart_data).chart

prs.save('test1.pptx')

Я получаю ошибку

Файл "C: \ Users \ adnan \ Google Drive \ Learning \ Python \ 5g_tti_parser \ untitled0.py", строка 31, в chart = slide2.shapes.add_chart (XL_CHART_TYPE.XY_SCATTER, x, y, cx, cy, chart_data) .chart

Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pptx \ sizes \ shapetree.py", строка 250, в add_chart rId = self.part.add_chart_part (chart_type, chart_data )

Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pptx \ parts \ slide.py", строка 174, в add_chart_part chart_part = ChartPart.new (chart_type, chart_data, self. package)

Файл "C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ pptx \ parts \ chart.py", строка 30, в новом файле chart_blob = chart_data.xml_bytes (chart_type)

AttributeError: объект типа 'XySeriesData' не имеет атрибута 'xml_bytes'

1 Ответ

2 голосов
/ 30 мая 2020

Я тоже работаю над этим сегодня - похоже, вы пропустили несколько шагов.

Убедитесь, что у вас есть правильный импорт, который включает:

from pptx.chart.data import XySeriesData, XyChartData

Измените эту строку:

chart_data = XySeriesData

, чтобы создать экземпляр класса XyChartData:

chart_data = XyChartData()

, тогда вам нужно добавить серию (которая создает объект XySeries), дать ему имя и числовой формат (я использую None)

chart_data.add_series('name_of_series', number_format= None)

THEN

chart_data.x_values=[0,1,2,3,4,5]
chart_data.y_values=[10,22,33,38,40,43]

Я не совсем уверен, решит ли это вашу проблему, но надеюсь, что это поможет. Сегодня я смог заменить данные на диаграмме рассеяния.

EDIT:

Установка значений x_values ​​и y_values ​​для объекта chart_data была непоследовательной и ненадежной. В приведенном ниже примере укажите в списках numeri c имена переменных. Для ясности я использую x_values_list и y_values_list.

Новый метод:

Сохраните объект add_series в переменную и добавьте точки данных x и y по отдельности.

chart_data = XyChartData()    
cd = chart_data.add_series('name_of_series', number_format= None)
    for x, y in list(zip(x_values_list, y_values_list)):
         cd.add_data_point(x, y, number_format=None)

На этом этапе chart_data содержит объект серии и может быть вставлен в фигуру диаграммы, а cd представляет объект XySeries. Я думаю, что x_values ​​и y_values ​​предназначены скорее как средства доступа, чем как писатели, возможно? Мне не удалось установить эти значения на уровне XySeries. У меня было много проблем при попытке настроить свои списки на эти атрибуты на уровне XyChartData. Это работает намного лучше.

...