Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ValueError when using matplotlib tight_layout()

Ok, this is my first time asking a question on here, so please be patient with me ;-)

I'm trying to create a series of subplots (with two y-axes each) in a figure using matplotlib and then saving that figure. I'm using GridSpec to create a grid for the subplots and realised that they're overlapping a little, which I don't want. So I'm trying to use tight_layout() to sort this out, which according to the matplotlib documentation should work just fine. Simplifying things a bit, my code looks something like this:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

fig = plt.figure(num=None, facecolor='w', edgecolor='k')
grid = gridspec.GridSpec(2, numRows) 
# numRows comes from the number of subplots required

# then I loop over all the data files I'm importing and create a subplot with two y-axes each time
  ax1 = fig.add_subplot(grid[column, row])
  # now I do all sorts of stuff with ax1...
  ax2 = ax1.twinx()
  # again doing some stuff here

After the loop for data processing is done and I have created all the subplots, I eventually end with

fig.tight_layout()
fig.savefig(str(location))

As far as I can work out, this should work, however when calling tight_layout(), I get a ValueError from the function self.subplotpars: left cannot be >= right. My question is: How do I figure out what's causing this error and how do I fix it?

like image 932
ally Avatar asked Mar 28 '14 09:03

ally


1 Answers

I've had this error before, and I have a solution that worked for me. I'm not sure if it will work for you though. In matplotlib, the command

plt.fig.subplots_adjust() 

can be used to sort of stretch the plot. The left and bottom stretch more the smaller the number gets, while the top and right stretch more the greater the number is. So if left is greater than or equal to the right, or bottom is greater than or equal to the top, than the graph would kind of flip over. I adjusted my command to look like this:

fig = plt.figure()
fig.subplots_adjust(bottom = 0)
fig.subplots_adjust(top = 1)
fig.subplots_adjust(right = 1)
fig.subplots_adjust(left = 0)

Then you can fill in your own numbers to adjust this, as long as you keep the left and bottom smaller. I hope this fixes your problem.

like image 103
Gareth Avatar answered Sep 19 '22 06:09

Gareth