Mengumpulkan Data XY dari Grafik Scatter PowerPoint

Mengumpulkan Data XY dari Grafik Scatter PowerPoint

Dalam beberapa tahun terakhir, saya pernah harus mengumpulkan data dari grafik scatter yang terkait dengan spreadsheet Excel dalam presentasi PowerPoint. Namun, ketika spreadsheet tersebut hilang atau tidak tersedia, saya memerlukan cara untuk mengumpulkan data secara manual.

Pada dasarnya, data grafik scatter PowerPoint berupa elemen c:xVal dan c:yVal yang terbagi antara seri-seri dalam presentasi. Dalam contoh ini, kita akan menggunakan XPath dan lxml.etree._Element untuk mendapatkan data.

Mengumpulkan Data XY

Kita dapat menggunakan kode Python berikut untuk mengumpulkan data XY dari grafik scatter:

from pptx import Presentation
from pptx.chart.series import XySeries
import numpy as np

def get_chart_data(prs):
 for sld in prs.slides:
 for shape in sld.shapes:
 if shape.has_chart:
 chart = shape.chart
 series_data = {}
 series_data[shape.name] = {}
 if isinstance(chart.series[0], XySeries): #check if XY Series
 for series in chart.series:
 x_values, y_values = read_xy(series)

 #create dictionary with Chart name and series names
 series_data[shape.name][series.name] = np.array([x_values, y_values])
 for c in series_data.keys(): #get chart keys
 for s in series_data[c].keys(): # get series keys
 data_final = series_data[c][s].T #retrieve XY data for given chart and series
 np.savetxt(f'{shape.name}_{s}.csv', data_final, delimiter=',')
def read_xy(series):
 xVal = {}
 yVal = {}
 ser = series._ser
 x_pts = ser.xpath(".//c:xVal//c:pt") # get all xVals from xml with xpath query
 y_pts = ser.xpath(".//c:yVal//c:pt") # get all yVals from xml with xpath query
 for i in range(len(x_pts)): #loop through all xVals
 x_value = get_pt_val(x_pts[i]) #call function to get each x value
 y_value = get_pt_val(y_pts[i]) #call function to get each y value
 xVal[x_pts[i].idx] = x_value #store x value in dictionary
 yVal[y_pts[i].idx] = y_value # store y value in dictionary

 # in case x & y idx don't have matching pairs return keys that are common to both x & y
 key = set.intersection(*tuple(set(d.keys()) for d in [xVal, yVal]))
 xVal = [xVal[x] for x in key] #create xVal list
 yVal = [yVal[x] for x in key] #create yVal list
 return xVal, yVal

def get_pt_val(pt):
 str_value = pt.xpath("./c:v")[0].text #retrieve point value
 value = float(str_value)
 return value

if __name__ == '__main__':
 prs = Presentation('Test.pptx')
 get_chart_data(prs)

Bagaimana Kode Berkerja

Kode di atas pertama-tama memeriksa apakah presentasi memiliki grafik scatter yang terkait dengan spreadsheet Excel. Jika ya, maka kode akan menjelajahi setiap slide dan setiap shape (grafik) untuk mencari grafik scatter.

Kemudian, kode akan membaca data dari grafik scatter menggunakan XPath dan lxml.etree._Element. Dalam contoh ini, kita mengumpulkan semua nilai x dan y dari grafik scatter dan kemudian me-matchkan pairnya berdasarkan idx.

Akhirnya, kode akan menulis data XY ke dalam file CSV untuk setiap chart dan series.

Dapatkah Kita Menggunakan Kode Ini?

Kode di atas dapat digunakan untuk mengumpulkan data XY dari grafik scatter yang terkait dengan spreadsheet Excel dalam presentasi PowerPoint. Namun, perlu diingat bahwa kode ini hanya berfungsi jika grafik scatter tersebut memiliki idx yang sesuai dan tidak ada data yang hilang.

Selain itu, kode ini juga dapat digunakan sebagai referensi untuk mengumpulkan data dari grafik lainnya, seperti bar chart atau line chart.