在绘图区自定义绘图时可能遇到的几个问题

前面几节介绍了自定义新图表的几种方法,在反复试验的过程中,笔者发现几个问题,需要引起大家的注意。[大谦Excel,dqexcel点com]

图表与图形混合时的覆盖问题

2.3.3小节和2.5节介绍了绘制散点柱状图的两种方法,前面一种中柱状图和抖动散点图都是通过绘制自定义图形元素来实现的,后面一种则是使用Shapes对象的AddChart2方法创建Chart对象然后逐个添加序列得到的。两种方法得到的散点柱状图都没有什么问题。但是,如果抖动散点图用图表序列绘制,柱状图用自定义图形元素绘制,绘制的图表就可能出现问题。

问题之一是图形覆盖问题。测试发现,绘制的自定义图形元素始终位于图表的上方。也就是说,即使先画柱状图后画散点图,柱状图也会覆盖在散点图的上方,如图2-51所示。Excel这样处理比较好理解,因为绘制图形元素用于标注时,有时候是需要绘制在绘图区以外的。此时可以通过设置面和线的透明度部分解决覆盖问题。

Document Image
\[\]

图2-51 带误差条的柱状图

实现图2-51的完整代码见:Samples->ch05 创建新图表->47 图表序列与自定义图元混合绘制时的覆盖问题->py.py。

图表与图形混合时的图表变形问题

图表和图形混合绘图时的第2个问题是,图表绘制完成后,改变图表的大小时图表会出现变形。如图2-52所示,将图2-51所示的图表中柱状图设置为半透明,然后在垂向上拉伸图表,柱状图向上移动,脱离了0基线。

出现这种情况,是因为绘图区和图表区之间的位置和比例关系发生了变化,导致坐标转换时计算出现偏差,画出来的图相应地出现变形。

解决此问题的方法是创建图表时固定图片的大小,成图后不再改变。

Document Image
\[\]

图2-52 带误差条的柱状图

提高绘制图表的速度

2.3.3小节绘制散点柱状图时,会发现用Python xlwings绘图时速度比较慢,绘图的过程好像在做动画演示。此时可以通过设置Excel应用对象的ScreenUpdating属性进行加速。Windows绘图时,画面每发生一次变化,系统会先清空绘图窗口中的画面然后重绘以反映这个变化。但是清空绘图窗口和重绘需要时间。

ScreenUpdating属性的作用便是确定是否进行清空和重绘,取值为False时,取消;取值为True时,开启。所以,下面用图形元素绘制散点柱状图的代码中,在绘图之前将该属性的值设置为False,绘完之后再设置为True。这样,中间的绘图过程就不更新了,而是绘完后一次性更新。这样就节省了中间清空和绘图的时间。

code.python
#... 省略部分代码
from comtypes.client import CreateObject
app2=CreateObject("Excel.Application")  #创建Excel应用
app2.Visible=True  #应用窗口可见
wb2=app2.Workbooks.Open(root+r'/data.xlsx')  #添加工作簿
sht2=wb2.Sheets('Sheet1')  #获取第1个工作表
app2.ScreenUpdating=False    #取消清空和重绘
shp=sht2.Shapes.AddChart2()    #创建空白图表
shp.Left=20
cht=shp.Chart    #获取图表
#... 省略部分代码
app2.ScreenUpdating=True    #开启清空和重绘,一次性更新画面

实现本例的完整代码见:Samples->ch05 创建新图表->49 提高自定义绘图的速度->py.py。