组合已有类型的图表创建新图表

前面两节介绍了用基本图形元素搭建新图表和在Excel图表基础上重建图元创建新图表,除此之外,还可以通过组合已有类型图表来创建新图表。[大谦Excel,dqexcel点com]

2.3.1小节介绍了散点柱状图的创建,用多边形绘制柱状图,用点绘制抖动散点图。所以,该图是用基本图形元素搭建而成的。本节还是用散点柱状图为例来演示组合已有类型的图表创建新图表。与前面不同的是,本例中用Shapes对象的AddChart2函数创建Excel图表,并用逐个添加序列的方式添加柱状图序列和散点图序列。所以,实际上是通过组合两种类型的图表来创建散点柱状图。图表效果如图2-40所示。

Document Image
\[\]

图2-40 散点柱状图

下面的代码实现图2-40。注意,绘制散点图之前需要用随机数对各组数据的横坐标进行抖动,生成抖动散点图。完整代码见:Samples->ch05 创建新图表->38 散点柱状图的另外一种实现->py.py。

code.python
def draw_rnd_scatter(cht,x,y,n,w):
    cht.SeriesCollection().NewSeries()    #新建序列
    count=cht.SeriesCollection().Count    #序列索引号
    rd=[]
    for i in range(n):
        rd.append(x-w/2+w*np.random.rand(1)[0])    #水平抖动各散点
    cht.SeriesCollection(count).ChartType=-4169    #序列图表类型为散点图
    cht.SeriesCollection(count).XValues=rd    #横轴数据
    cht.SeriesCollection(count).Values=y    #纵轴数据
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')    #获取指定工作表对象
shp=sht.api.Shapes.AddChart2()    #创建空白图表
shp.Left=20
cht=shp.Chart    #获取图表
cht.ChartType=xw.constants.ChartType.xlXYScatter    #图表类型为散点图
ax1=cht.Axes(1)    #获取横轴
ax2=cht.Axes(2)    #获取纵轴
ax1.MinimumScale=0    #横轴最小值.5
ax1.MaximumScale=4.5
ax2.MinimumScale=0    #纵轴最小值
ax2.MaximumScale=0.35
set_style(cht)    #设置样式
data=sht.range('B2:E21').value    #获取数据
dt=np.transpose(data)    #转置
dt1=dt[0]    #获取当前行数据,及原始矩阵的列数据
dt2=dt[1]
dt3=dt[2]
dt4=dt[3]
aveg=[0 for _ in range(4)]
aveg[0]=app.api.WorksheetFunction.Average(dt1)    #求每组数据的均值
aveg[1]=app.api.WorksheetFunction.Average(dt2)
aveg[2]=app.api.WorksheetFunction.Average(dt3)
aveg[3]=app.api.WorksheetFunction.Average(dt4)
#绘柱状图
cht.SeriesCollection().NewSeries()    #新建序列
n=cht.SeriesCollection().Count    #新序列的索引号
cht.SeriesCollection(n).ChartType=xw.constants.ChartType.xlColumnClustered    #图表类型
cht.SeriesCollection(n).XValues=[1,2,3,4]    #横轴数据
cht.SeriesCollection(n).Values=aveg    #纵轴数据
cht.SeriesCollection(n).Format.Fill.ForeColor.RGB=xw.utils.rgb_to_int((76,200,132))  #颜色
cht.ChartGroups(1).GapWidth=100    #分组之间的距离
#绘抖动散点图
draw_rnd_scatter(cht,1,dt1,20,0.5)
draw_rnd_scatter(cht, 2, dt2, 20, 0.5)
draw_rnd_scatter(cht, 3, dt3, 20, 0.5)
draw_rnd_scatter(cht, 4, dt4, 20, 0.5)

运行代码生成图2-40。