Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matplotlib tight_layout -- remove extra white/empty space

I want to minimise whitespace around my figures and am unsure how to a) precisely specify a bounding box for the savefig command around my image and b) why the tight-layout command does not work in my working example.

In my current example, I set up an axis environment tightly around my objects/patches (so tightly that the yellow objects and blue box are almost cut off on the left and bottom, respectively). However, this still gives me white space both to the left and bottom: enter image description here

I am aware that this comes from the axis object (which I turned off) enter image description here

However, I'm not sure how to get rid off the white space in this case. I thought that one could specify the bounding box as discussed Matplotlib tight_layout() doesn't take into account figure suptitle but inserting

fig.tight_layout(rect=[0.1,0.1,0.9, 0.95]), 

this only gives me more whitespace: enter image description here

I know how to sneak my way round this by inserting an axis object that fills the full figure etc but this feels like a silly hack. Is there an easy and fast way to do this?

My code is:

import matplotlib
from matplotlib import pyplot as plt
from matplotlib.path import Path
import matplotlib.patches as patches
from matplotlib.collections import PatchCollection
from matplotlib.patches import FancyBboxPatch


plt.ion()

fig, ax=plt.subplots(1)
ax.set_xlim([-0.38,7.6])
ax.set_ylim([-0.71,3.2])
ax.set_aspect(0.85)
#objects 
circs2=[]
circs2.append( patches.Circle((-0.3, 1.225), 0.1,ec="none"))
circs2.append( patches.RegularPolygon ((-0.3,1.225+1.5),4, 0.1) )
coll2 = PatchCollection (circs2,zorder=10)
coll2.set_facecolor(['yellow', 'gold'])
ax.add_collection(coll2)

#squares
p_fancy=FancyBboxPatch((0.8,1.5),1.35,1.35,boxstyle="round,pad=0.1",fc='red', ec='k',alpha=0.7, zorder=1)
ax.add_patch(p_fancy)
x0=4.9
p_fancy=FancyBboxPatch((1.15+x0,-0.6),0.7*1.15,0.7*1.15,boxstyle="round,pad=0.1", fc='blue', ec='k',alpha=0.7, zorder=1)
ax.add_patch(p_fancy)

plt.axis('off')

fig.tight_layout(rect=[0.1,0.1,0.9, 0.95])
like image 799
mzzx Avatar asked Dec 19 '17 17:12

mzzx


Video Answer


1 Answers

You can remove the x and y axis and then use savefig with bbox_inches='tight' and pad_inches = 0 to remove the white space. See code below:

plt.axis('off') # this rows the rectangular frame 
ax.get_xaxis().set_visible(False) # this removes the ticks and numbers for x axis
ax.get_yaxis().set_visible(False) # this removes the ticks and numbers for y axis
plt.savefig('test.png', bbox_inches='tight',pad_inches = 0, dpi = 200). 

This will result in

enter image description here

In addition, you can optionally add plt.margins(0.1) to make the scatter points not touch the y axis.

like image 169
plasmon360 Avatar answered Sep 22 '22 01:09

plasmon360