前面两节介绍了用基本图形元素搭建新图表和在Excel图表基础上重建图元创建新图表,除此之外,还可以通过组合已有类型图表来创建新图表。[大谦Excel,dqexcel点com]
2.3.1小节介绍了散点柱状图的创建,用多边形绘制柱状图,用点绘制抖动散点图。所以,该图是用基本图形元素搭建而成的。本节还是用散点柱状图为例来演示组合已有类型的图表创建新图表。与前面不同的是,本例中用Shapes对象的AddChart2函数创建Excel图表,并用逐个添加序列的方式添加柱状图序列和散点图序列。所以,实际上是通过组合两种类型的图表来创建散点柱状图。图表效果如图2-40所示。
\[\]
图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。