也可以在已有Excel图表的基础上重新渲染图形元素或使用新的图形元素进行表现,从而创建新的图表。比如本节用单色或渐变色填充两条折线之间的区域,创建特殊的面积图。图2-37用单色填充两条折线之间的区域。[大谦Excel,dqexcel点com]
\[\]
图2-37 用单色填充两条折线之间的区域
下面的代码实现图2-37。绘图的思路是用两条折线的数据点组合成一个封闭的多边形,然会绘制这个多边形。注意,组合时多边形的顶点要按逆时针方向排列。完整代码见:Samples->ch05 创建新图表->35 填充两条折线之间的区域->py.py。
code.python
root=os.getcwd() #获取当前工作路径
app=xw.App(visible=True,add_book=False) #创建Excel应用
wb=app.books.open(root+r'/data.xlsx',read_only=False) #打开数据文件返回工作簿对象
sht=wb.sheets('Sheet1') #获取指定工作表对象
data=sht.range('A1:C100').value #获取数据
app.kill() #退出应用
#从comtypes包中导入CreateObject函数
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个工作表
shp=sht2.Shapes.AddChart2() #创建空白图表
shp.Left=20
cht=shp.Chart #获取图表
cht.ChartType=-4169 #散点图 #散点图
ax1=cht.Axes(1) #获取横轴
ax2=cht.Axes(2) #获取纵轴
ax1.MinimumScale=0 #横轴最小值
ax1.MaximumScale=101
ax2.MinimumScale=0 #纵轴最小值
ax2.MaximumScale=120
set_style(cht) #设置样式
cht.SeriesCollection().NewSeries() #新建序列
#构造多边形画填充面,两条折线围成多边形
pt=[[0 for _ in range(2)] for _ in range(201)]
#注意多边形顶点逆时针方向排列
for i in range(100):
pt[i][0]=shape_x(cht,100-i)
pt[i][1]=shape_y(cht,data[100-i-1][1])
for i in range(100,200):
pt[i][0]=shape_x(cht,i-100)
pt[i][1]=shape_y(cht,data[i-100][2])
pt[200][0]=pt[0][0] #最后一个点与第一个点重合
pt[200][1]=pt[0][1]
shp=cht.Shapes.AddPolyline(pt) #绘制多边形
shp.Fill.ForeColor.RGB=xw.utils.rgb_to_int((76,200,132)) #单色填充
shp.Line.Visible=False #隐藏边线
shp.Fill.Transparency=0.3 #半透明
运行代码生成图2-37。
下面的代码实现图2-38。图中对两条折线顶点组成的多边形进行垂直渐变色填充。完整代码见:Samples->ch05 创建新图表->36 填充两条折线之间的区域2->py.py。
\[\]
图2-38 用垂直渐变色填充两条折线之间的区域
code.python
#... 省略部分代码
shp=cht.Shapes.AddPolyline(pt) #绘制多边形
shp.Fill.ForeColor.RGB=xw.utils.rgb_to_int((255,128,0)) #垂向多色渐变填充
shp.Fill.OneColorGradient(1,1,1)
shp.Fill.GradientStops.Insert(xw.utils.rgb_to_int((0,255,0)),0.5)
shp.Fill.GradientStops.Delete(2)
shp.Fill.GradientStops.Insert(xw.utils.rgb_to_int((0,0,255)),1)
shp.Line.Visible=False #隐藏边线
运行代码生成图2-38。
下面的代码实现图2-39。图中对两条折线顶点组成的多边形进行水平渐变色填充。完整代码见:Samples->ch05 创建新图表->37 填充两条折线之间的区域3->py.py。
\[\]
图2-39 用水平渐变色填充两条折线之间的区域
code.python
#... 省略部分代码
shp=cht.Shapes.AddPolyline(pt) #绘制多边形
shp.Fill.ForeColor.RGB=xw.utils.rgb_to_int((0,0,255)) #水平向多色渐变填充
shp.Fill.OneColorGradient(2,1,1)
shp.Fill.GradientStops.Insert(xw.utils.rgb_to_int((0,255,0)),0.5)
shp.Fill.GradientStops.Delete(2)
shp.Fill.GradientStops.Insert(xw.utils.rgb_to_int((255,128,0)),1)
shp.Line.Visible=False #隐藏边线
运行代码生成图2-39。