You should be able to solve your problems doing the following:
Figure size (edit): 
- Measure how high and wide is a cell (e.g. 
hcell=0.3, wcell=1) 
- Get/know the number of rows and columns (in your case 
len(clust_data)+1 and 3) 
create the figure with the correct size (you might want some extra padding)
fig = plt.figure(figsize=(3*wcell+wpad, nrows*hcell+hpad))
 
 
The lines within the two rows are the axes spines. 
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
just hide the axis labels and ticks, not the axes spines.
You have to hide them or colour them in white 
 
see full solution below
In any case: it looks to me that you are doing a whole lot of useless operations.
From your piece of code it seems to me that clust_data is already a list of lists with the correct shape and that cellText after being filled is going to be the same of clust_data.
Furthermore, try not to mix the OO and pyplot interface of matplotlib. 
The following code should be equivalent to yours
fig=plt.figure()
ax = fig.add_subplot(111)
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
colLabels=("Structure", "Energy", "Density")
the_table = ax.table(cellText=clust_data,
          colLabels=colLabels,
          loc='center')
plt.savefig("table.png")
Edit: full solution
Convoluted way
You have to hide the axes spines (e.g. setting their color white) and give them low zorder then add the table with higher zorder
colLabels=("Structure", "Energy", "Density")
nrows, ncols = len(clust_data)+1, len(colLabels)
hcell, wcell = 0.3, 1.
hpad, wpad = 0, 0    
fig=plt.figure(figsize=(ncols*wcell+wpad, nrows*hcell+hpad))
ax = fig.add_subplot(111)
#remove axis ticks and labels
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
#hide the spines
for sp in ax.spines.itervalues():
    sp.set_color('w')
    sp.set_zorder(0)
#do the table
the_table = ax.table(cellText=clust_data,
          colLabels=colLabels,
          loc='center')
#put the table in front of the axes spines 
#for some reason zorder is not a keyword in ax.table
the_table.set_zorder(10)
plt.savefig("table.png")
Simple way (credit @JoeKington)
Just switch off the axis
colLabels=("Structure", "Energy", "Density")
nrows, ncols = len(clust_data)+1, len(colLabels)
hcell, wcell = 0.3, 1.
hpad, wpad = 0, 0    
fig=plt.figure(figsize=(ncols*wcell+wpad, nrows*hcell+hpad))
ax = fig.add_subplot(111)
ax.axis('off')
#do the table
the_table = ax.table(cellText=clust_data,
          colLabels=colLabels,
          loc='center')
plt.savefig("table.png")