柱状图应该是最常用的图表了,比如说要在幻灯片页面上添加某超市某一年的四个季度不同类别产品的销售量的柱状图。我就直接上代码了:
from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.util import Cm
ppt = Presentation()
chart_data = CategoryChartData()
chart_data.categories = ['数码娱乐','生活用品','文化用品']
chart_data.add_series('Q1',(36.6,65.5,10.0))
chart_data.add_series('Q2',(21.1,52.1,3.1))
chart_data.add_series('Q3',(15.9,22.3,9.8))
chart_data.add_series('Q4',(20.4,35.3,3.2))
slide = ppt.slides.add_slide(ppt.slide_layouts[6])
x = y = Cm(3)
width = Cm(20)
height = Cm(10)
graphic_frame = slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED,x,y,width,height,chart_data
)
ppt.save("./ppt_ files/test.pptx")
在上面的代码中,在距离页面左边和上边都是3厘米的位置上,添加了一个宽度为20厘米、高度为10厘米的柱状图,柱状图的类型用XL_CHART_TYPE.COLUMN_CLUSTERED表示。如果想知道其他图表的类型,可以打印XL_CHART_TYPE这个枚举类,这种操作我已经演示过好几次了,这里就不上代码了,参考以前的代码试一下吧。
存储柱状图数据的是一个CategoryChartData对象,它的categories属性存储的是类别,对应x轴的标签,我们给它一个列表就行了。调用CategoryChartData对象的add_series()方法可以添加数据系列,要添加几组数据就调用几次。
执行上面的代码之后我们就可以得到一个柱状图了,这个柱状图的样式是未经修改的默认样式,如图8-3所示。
默认的样式好像太简单了,也许你还有更多的需求,比如说修改它的坐标轴,尤其是x轴和y轴的标签,修改x轴和y轴的代码如下:
from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE,XL_TICK_MARK
from pptx.util import Cm,Pt
ppt = Presentation()
...
graphic_frame = slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED,x,y,width,height,chart_data
)
chart = graphic_frame.chart
# 获取分类,即获取x轴
category_axis = chart.category_axis
# 不同分类用竖线隔开
# category_axis.has_major_gridlines = True
# x轴标签字体样式
# category_axis.tick_labels.font.italic = True
# category_axis.tick_labels.font.size = Pt(15)
# 获取y轴
value_axis = chart.value_axis
# y轴最大刻度,不设置则自动调整
# value_axis.maximum_scale = 100
# y轴小刻度方向,INSIDE朝内,OUTSIDE朝外
# value_axis.minor_tick_mark = XL_TICK_MARK.INSIDE
# 显示y轴小刻度线
# value_axis.has_minor_gridlines = True
# 获取y轴标签
tick_labels = value_axis.tick_labels
# y轴标签格式化
tick_labels.number_format = '0"万"'
# y轴标签字体样式
# tick_labels.font.bold = True
tick_labels.font.size = Pt(15)
ppt.save("./ppt_ files/test.pptx")
我们调用SlideShapes的add_chart()方法得到的是一个GraphicFrame对象,访问它的chart属性就能拿到图表对象了,也就是Chart对象。访问Chart对象的category_axis属性可以拿到它的标签信息,其实就是x轴,然后就可以修改分类的分隔线、字体等样式了,它的字体存储在x轴的标签上,访问tick_labels属性即可拿到标签。
访问Chart对象的value_axis属性可以获取到y轴,再访问一下y轴的tick_labels属性就可以拿到y轴的标签了,修改字体等操作都很容易。上面修改样式的代码被我注释了一部分,因为如果这些样式都设置了,图表就会显得很乱,但我在主要代码上方都写好注释了,自己动手跟着操作一遍看看具体的效果,上面的代码执行之后的效果如图8-4所示。
除了修改坐标轴的标签,也许还需要添加一些图例,不然也不知道哪个颜色的柱子代表哪个季度啊。添加图例很简单,代码如下:
from pptx import Presentation
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE,XL_LEGEND_POSITION
from pptx.util import Cm,Pt
ppt = Presentation()
...
graphic_frame = slide.shapes.add_chart(
XL_CHART_TYPE.COLUMN_CLUSTERED,x,y,width,height,chart_data
)
chart = graphic_frame.chart
# 添加图例
chart.has_legend = True
# 图例位置
chart.legend.position = XL_LEGEND_POSITION.TOP
# 图例是否在图表里
chart.legend.include_in_layout = False
ppt.save("./ppt_ files/test.pptx")
执行完上面的代码之后,打开文档看看,就会发现这个柱状图有图例了,如图8-5所示。
添加图例,首先要把Chart对象的has_legend属性改为True,然后再设置一下它的位置就可以了。图例的位置可以位于图表的上下左右四个方向,比如说XL_LEGEND_POSITION.TOP表示把图例放在图表的顶部,因为TOP就是指上边嘛,其他的方向也容易猜到,无非就是BOTTOM、LEFT、RIGHT,可以自己动手尝试。
特别说明一下,给柱状图设置坐标轴样式的写法,在其他有坐标轴的图表类型中同样适用,至于图例的写法,基本上对常用的图表类型都适用,不过任何时候都不要把话说太满,反正具体情况具体分析吧。