Your problem seems to be with the axes. You have a big white axis area around your table, and the png is created with tight borders around the axis, not the table. Removing the axis background colour helps a bit:
ax.set_axisbgcolor((0,0,0,0))
gets you transparent graph area. The point with a transparent bg is that it should stay transparent in PPT as well. Another way to specify the transparency is when you create the subplot:
add_subplot(111, axisbg='none')
Then you will also have to adjust the axis position relative to the figure, for example:
ax.set_position([0, 0, 1, 1])
to fill the whole figure.
The cell colours can be set when creating the table, but it seems to be a bit clumsy:
tbl=plt.table(cellText=data, cellColours=[["#EEECE1"] * len(data[0])]*len(data))
N.B. At least my matplotlib is buggy here, see the end of the answer.
So, something along these lines:
data=[[10,10,10,5,5,5,2,2,2,4,4,4,4,4,4,5,5,5],[10,10,10,5,5,5,2,2,2,4,4,4,4,4,4,5,5,5],[10,10,10,5,5,5,2,2,2,4,4,4,4,4,4,5,5,5],[10,10,10,5,5,5,2,2,2,4,4,4,4,4,4,5,5,5]]
fig = plt.figure(figsize=(6,2))
ax = fig.add_subplot(111, axisbg='none')
ax.axis('off')
ax.set_position([0, 0, 1, 1])
rows=['AB','BC','SK','MB']
cols=["Gas", "Wk/Wk", "Yr/Yr","Oil", "Wk/Wk", "Yr/Yr","Bit", "Wk/Wk", "Yr/Yr","Total", "Wk/Wk", "Yr/Yr","Hor", "Wk/Wk", "Yr/Yr","Vert/Dir", "Wk/Wk", "Yr/Yr"]
table = ax.table(cellText=data, colLabels=cols, rowLabels=rows, rowColours=['none']*len(data), colColours=['none']*len(data[0]), loc='upper center',cellLoc='center', cellColours=[["none"] * len(data[0])] * len(data))
table.auto_set_font_size(True)
table.scale(1.5, 1.5)
plt.savefig("test.png", format='png',bbox_inches='tight')
This should produce a table with fully transparent background. If you want to have background colour for the cells, change the "none" in cellColours. Kw args rowColours and colColours determine the colours behind the column and row labels. If you want to set the background for the whole image, change it in the axisbg argument of add_subplot.
And be warned: it seems that different versions of matplotlib do a bit different things with the scaling.
UPDATE: There may be a bug in table.py in factory function table... It seems that if both colColors and colLabels are defined, the cell offset is 0, and the rows jump to a wrong place.
The workaround is an ugly hack, but:
table = ax.table(cellText=data, colLabels=cols, rowLabels=rows, loc='upper center',cellLoc='center')
for cidx in table._cells:
table._cells[cidx].set_facecolor('none')
will do. table._cells is a dictionary of cells (which are built on the Rectangle class). The same trick enables you to do whatever fancy colouring for the cell faces or edges, and the dict keys are cell coordinates.