修改已有图表创建新图表

也可以在已有Excel图表的基础上重新渲染图形元素或使用新的图形元素进行表现,从而创建新的图表。比如本节用单色或渐变色填充两条折线之间的区域,创建特殊的面积图。图2-37用单色填充两条折线之间的区域。[大谦Excel,dqexcel点com]

Document Image
\[\]

图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。

Document Image
\[\]

图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。

Document Image
\[\]

图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。