散点图就是在图表上画一些点,这些点的位置由它们的x、y坐标决定,先来简单看看python-pptx绘制散点图的方法吧。假设我们要画两组数据,每组数据就只有三个点,代码如下:
from pptx import Presentation
from pptx.chart.data import XyChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Cm
ppt = Presentation()
chart_data = XyChartData()
series_1 = chart_data.add_series('系列1')
series_1.add_data_point(0.7,2.7)
series_1.add_data_point(1.8,3.2)
series_1.add_data_point(2.6,0.8)
series_2 = chart_data.add_series('系列2')
series_2.add_data_point(1.3,3.7)
series_2.add_data_point(2.7,2.3)
series_2.add_data_point(1.6,1.8)
slide = ppt.slides.add_slide(ppt.slide_layouts[6])
x = y = Cm(3)
width = Cm(20)
height = Cm(10)
slide.shapes.add_chart(
XL_CHART_TYPE.XY_SCATTER,x,y,width,height,chart_data
)
ppt.save("./ppt_ files/test.pptx")
散点图的数据与柱状图的不同,因为它只有x、y两个值,所以要实例化一个XyChartData对象去存储,调用它的add_series()方法新增一个系列,也就是一组数据,你有几组就调用几次。每个系列对象都是通过调用add_data_point()方法把点的x、y坐标添加进去,最后调用slide.shapes.add_chart()方法创建一个散点图,散点图的图表类型是XL_CHART_TYPE.XY_SCATTER,至于散点图的位置和宽高的设置方法就不用多说了,和柱状图的设置方法一致。
我们不妨把之前的四个季度的不同类型产品销量也做成一个散点图,x轴是季度,y轴是销量,每一个分类都是一个系列,可以想想这代码应该怎么写,其实不难,就把上面的简单散点图的数据稍微改一下就行,自己思考之后再参考我的代码:
from pptx import Presentation
from pptx.chart.data import XyChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Cm
ppt = Presentation()
chart_data = XyChartData()
sale_info = [
{"category":"数码娱乐","sale_volume":[36.6,21.1,15.9,
20.4]},
{"category":"生活用品","sale_volume":[65.5,52.1,22.3,
35.3]},
{"category":"文化用品","sale_volume":[10.0,3.1,9.8,3.2]},
]
for info in sale_info:
series = chart_data.add_series(info.get("category"))
for quarter,volume in enumerate(info.get("sale_volume")):
series.add_data_point(quarter + 1,volume,number_
format='0"季度"')
slide = ppt.slides.add_slide(ppt.slide_layouts[6])
x = y = Cm(3)
width = Cm(20)
height = Cm(10)
chart = slide.shapes.add_chart(
XL_CHART_TYPE.XY_SCATTER,x,y,width,height,chart_data
).chart
x_axis = chart.category_axis
x_axis.has_title = True
x_axis.axis_title.text_frame.text = "季度"
y_axis = chart.value_axis
y_axis.has_title = True
y_axis.axis_title.text_frame.text = "销量"
chart.has_legend = True
ppt.save("./ppt_ files/test.pptx")
为了方便读取数据,我把销售数据放在一个列表里,然后再通过遍历的方式读取每一个系列的数据,如果对遍历的写法已经熟悉了,那么应该是很容易看懂的。添加好散点图之后,再修改一下x、y坐标轴的标题,先获取坐标轴,然后把坐标轴的has_title属性设置为True,这样就可以显示标题了。标题的文本存储在axis_title属性里,访问该属性就能得到一个文本框,关于TextFrame对象,前面已经学习过了,这里就看你对它的熟悉程度了。