Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matplotlib Table's Font Size

Working with Matplotlib in Python (2.7.9). I have to plot a table in a subplot (in this case subplot name is tab) but I can't seem to find a way to change the font size of the table (http://imgur.com/0Ttvzee - bottom left). Antman is happy about the results, I am not. This is the code I've been using.

EDIT: Added full code

def stat_chart(self):

DN      = self.diff
ij      = self.ij_list
mcont   = self.mcont
ocont   = self.ocont
ucont   = self.ucont
dist    = self.widths
clon    = '%1.2f' %self.mclon
clat    = '%1.2f' %self.mclat
clonlat = "{0}/{1}".format(clon,clat)
area    = self.area
perim   = self.perimeter
mdist   = np.array(self.widths)
mdist   = mdist[:,0]*10
mdist   = np.mean(mdist)
pstat   = self.polygon_status
if pstat == 1:
  status = "Overestimation"
else:
  status = "Underestimation"

# Setting up the plot (2x2) and subplots
fig   = plt.figure()
gs    = gridspec.GridSpec(2,2,width_ratios=[2,1],height_ratios=[4,1])
main  = plt.subplot(gs[0,0])
polyf = plt.subplot(gs[0,1])
tab   = plt.subplot(gs[1,0])
leg   = plt.subplot(gs[1,1])
tab.set_xticks([])
leg.set_xticks([])
tab.set_yticks([])
leg.set_yticks([])
tab.set_frame_on(False)
leg.set_frame_on(False)

# Main image on the top left
main.imshow(DN[::-1],cmap='winter')
x1,x2,y1,y2 = np.min(ij[:,1])-15,np.max(ij[:,1])+15,np.min(ij[:,0])-15,np.max(ij[:,0])+15
main.axvspan(x1,x2,ymin=1-((y1-320)/float(len(DN)-320)),ymax=1-((y2-320)/float(len(DN)-320)),color='red',alpha=0.3)
main.axis([0,760,0,800])

# Polygon image on the top right
polyf.imshow(DN,cmap='winter')
polyf.axis([x1,x2,y2,y1])
polyf.plot(mcont[:,1],mcont[:,0],'ro',markersize=4)
polyf.plot(ocont[:,1],ocont[:,0],'yo',markersize=4)
polyf.plot(ucont[:,1],ucont[:,0],'go',markersize=4)
for n,en in enumerate(dist):
  polyf.plot([en[2],en[4]],[en[1],en[3]],color='grey',alpha=0.3)

# Legend on the bottom right
mc = mlines.Line2D([],[],color='red',marker='o')
oc = mlines.Line2D([],[],color='yellow',marker='o')
uc = mlines.Line2D([],[],color='green',marker='o')
ed = mlines.Line2D([],[],color='black',alpha=0.5)
pos_p = mpatches.Patch(color='lightgreen')
neg_p = mpatches.Patch(color='royalblue')
leg.legend([mc,oc,uc,ed,pos_p,neg_p],("Model Cont.","Osisaf Cont.","Unknown Cont.","Dist. Mdl to Osi", \
  'Model Overestimate','Model Underestimate'),loc='center')

# Statistics table on the bottom left
stats = [[clonlat+' degrees' ,'%1.4E km^2' %area,'%1.4E km' %perim,'%1.4f km' %mdist,status]]
columns = ('Center Lon/Lat','Area','Perimeter','Mean Width','Status')
rows = ['TODOpolyname']
cwid = [0.1,0.1,0.1,0.1,0.1,0.1]
the_table = tab.table(cellText=stats,colWidths=cwid,rowLabels=rows,colLabels=columns,loc='center')
table_props = the_table.properties()
table_cells = table_props['child_artists']
for cell in table_cells: cell.set_height(0.5)
plt.show()

return

EDIT2: Eventually (un)solved plotting text instead of table. Good enough.

like image 290
GDino Avatar asked Jun 09 '15 08:06

GDino


People also ask

How do I change the font size in my matplotlib table?

To change a table's fontsize with matplotlib, we can use set_fontsize() method.

What is default matplotlib font size?

Note: The default font size for all elements is 10.

What is the font of matplotlib?

The default font family is sans-serif, because sans-serif fonts are generally more suitable for figures than serif fonts, and the default font name belonging to this family is DejaVu Sans, which comes packaged with matplotlib.

What is BBOX in matplotlib?

BboxTransformTo is a transformation that linearly transforms points from the unit bounding box to a given Bbox. In your case, the transform itself is based upon a TransformedBBox which again has a Bbox upon which it is based and a transform - for this nested instance an Affine2D transform.


2 Answers

I had a similar issue in changing the fontsize. Try the following

the_table.auto_set_font_size(False)
the_table.set_fontsize(5.5)

Worked for me.

like image 156
user2750362 Avatar answered Sep 28 '22 08:09

user2750362


According to the docs, table has a kwarg called fontsize, a float value for the size in points.

In your example from above, for a fontsize of 5 points you would use:

    the_table =tab.table(cellText=stats,colWidths=cwid,rowLabels=rows,colLabels=columns,loc='center',fontsize=5)

If you require greater control, you can pass a FontManager instance to the cell.set_text_props() method as described in this example. That would enable you to set the family, spacing, style etc, in addition to the size.

EDIT: Playing around with Matplotlib's example, it seems that just passing fontsize to the table has no effect. However, importing

    from matplotlib.font_manager import FontProperties

and then looping through the cells and running

    cell.set_text_props(fontproperties=FontProperties(size = 5))

does have the desired effect. It is unclear why the documented kwarg fontsize does not work in this (or apparently in your) case.

like image 39
mmdanziger Avatar answered Sep 28 '22 07:09

mmdanziger