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.