当前位置:  首页>> 技术小册>> Python与办公-玩转PPT

饼图就是把一个圆按照数据的比例划分成若干部分,大家应该都见过。饼图的形状类型是XL_CHART_TYPE.PIE,所以根据前面的画图经验,创建一个ChartData然后把数据添加进去,应该就能得到饼图了,看起来好像不是很难,代码如下:

  1. from pptx import Presentation
  2. from pptx.chart.data import ChartData
  3. from pptx.enum.chart import XL_CHART_TYPE
  4. from pptx.util import Cm
  5. chart_data = ChartData()
  6. chart_data.categories = ['Q1','Q2','Q3','Q4']
  7. sale_volume = [36.6,21.1,15.9,20.4]
  8. chart_data.add_series'数码娱乐',sale_volume
  9. ppt = Presentation()
  10. slide = ppt.slides.add_slide(ppt.slide_layouts[6])
  11. x = y = Cm(3)
  12. width = Cm(20)
  13. height = Cm(10)
  14. chart = slide.shapes.add_chart(
  15. XL_CHART_TYPE.PIE,x,y,width,height,chart_data
  16. ).chart
  17. ppt.save("./ppt_ files/test.pptx")

果然不是很难,执行代码之后确实可以得到一个饼图,得到的饼图如图8-9所示。

不过这个饼图确实简单得过分了,除了知道它是一个被分成四份的饼图,其他信息都没有,所以我们还需要改进,至少要把图例显示出来吧,另外我们还可以把每个部分的占比情况给显示出来,代码如下:

  1. from pptx import Presentation
  2. from pptx.chart.data import ChartData
  3. from pptx.enum.chart import XL_CHART_TYPE,XL_LEGEND_POSITION
  4. from pptx.enum.chart import XL_DATA_LABEL_POSITION
  5. from pptx.util import Cm
  6. chart_data = ChartData()
  7. chart_data.categories = ['Q1','Q2','Q3','Q4']
  8. sale_volume = [36.6,21.1,15.9,20.4]
  9. percent = [volume / sum(sale_volume) for volume in sale_volume]
  10. print(percent)
  11. # 输出:[0.3893617021276596,0.224468085106383,0.16914893617021276,
  12. 0.21702127659574466]
  13. chart_data.add_series'数码娱乐',percent
  14. ppt = Presentation()
  15. slide = ppt.slides.add_slide(ppt.slide_layouts[6])
  16. x = y = Cm(3)
  17. width = Cm(20)
  18. height = Cm(10)
  19. chart = slide.shapes.add_chart(
  20. XL_CHART_TYPE.PIE,x,y,width,height,chart_data
  21. ).chart
  22. chart.has_legend = True
  23. chart.legend.position = XL_LEGEND_POSITION.BOTTOM
  24. chart.plots[0].has_data_labels = True
  25. data_labels = chart.plots[0].data_labels
  26. data_labels.number_format = '0%'
  27. data_labels.position = XL_DATA_LABEL_POSITION.OUTSIDE_END
  28. ppt.save("./ppt_ files/test.pptx")

我们已经会了图例的设置,只要把Chart对象的has_legend属性改为True就行了,关键是还需要特别学一下显示饼图的百分比。首先,我们要提前算好数据的比例,添加系列的时候我们就传入算好的百分比而不是原始数据,因为饼图本来就是按照百分比显示的,所以我们把数据变成百分比之后显示的饼图比例是不会发生变化的。

饼图其实是一个PiePlot对象,我们通过chart对象的plots[0]拿到第一个PiePlot对象(本例中只有一个),先把PiePlot对象的has_data_labels属性改为True,它控制是否显示数据标签,然后再访问PiePlot对象的data_labels属性获取到数据标签,然后调用数据标签的number_format属性修改数据的显示格式,调用数据标签的position属性修改位置。上面代码的最后效果如图8-10所示。