How can I make a blank subplot in matplotlib?

Go To StackoverFlow.com

60

I am making a group of subplot (say, 3 x 2) in matplotlib, but I have fewer than 6 datasets. How can I make the remaining subplot blank?

The arrangement looks like this:

+----+----+
| 0,0| 0,1|
+----+----+
| 1,0| 1,1|
+----+----+
| 2,0| 2,1|
+----+----+

This may go on for several pages, but on the final page, there are, for example, 5 datasets to the 2,1 box will be empty. However, I have declared the figure as:

cfig,ax = plt.subplots(3,2)

So in the space for subplot 2,1 there is a default set of axes with ticks and labels. How can I programatically render that space blank and devoid of axes?

2012-04-05 20:22
by mishaF


94

You could always hide the axes which you do not need. For example, the following code turns of the 6-th axes completely:

import matplotlib.pyplot as plt

hf, ha = plt.subplots(3,2)
ha[-1, -1].axis('off')

plt.show()

and results in the following figure:

enter image description here

Alternatively, see the accepted answer to the question Hiding axis text in matplotlib plots for a way of keeping the axes but hiding all the axes decorations (e.g. the tick marks and labels).

2012-04-05 21:03
by Chris
Thanks - that's actually even closer to my original question. I already accepted the other answer and adapted my code to use it, but both approaches are great - mishaF 2012-04-05 21:06
Cool, that's indeed nice as there's less add_subplot() clutter - moooeeeep 2012-04-05 21:12
on second thought - such a better fit, that I switched... - mishaF 2012-04-10 02:22
This is marvependous - FaCoffee 2017-06-09 16:00
This does show no plot and one could say that this is a blank plot. I was looking for a plot which has no data, to explicitly show that there is no data. Any easy modification of this answer, which does that - Zelphir 2017-07-09 12:21
@Zelphir I'm not sure what you're after: the other five plots are empty graphs with no data, so I'm not sure what extra you're asking for. Also, this is a new question. In the future, please ask this as a new question rather than commenting on a old answer - Chris 2017-07-10 10:32
@Chris, that last blank space is perfect for adding a legend. Do you know any way to set the legend there - Stefano 2018-04-19 14:38


21

A much improved subplot interface has been added to matplotlib since this question was first asked. Here you can create exactly the subplots you need without hiding the extras. In addition, the subplots can span additional rows or columns.

import pylab as plt

ax1 = plt.subplot2grid((3,2),(0, 0))
ax2 = plt.subplot2grid((3,2),(0, 1))
ax3 = plt.subplot2grid((3,2),(1, 0))
ax4 = plt.subplot2grid((3,2),(1, 1))
ax5 = plt.subplot2grid((3,2),(2, 0))

plt.show()

enter image description here

2013-01-15 16:12
by Hooked
Wow - that's a nice improvement. So much simpler! Thanks @Hooked - mishaF 2013-01-24 21:56
@Hooked, that last blank space is perfect for adding a legend. Do you know any way to set the legend there - Stefano 2018-04-19 14:39
@Stefano sure there are ways of doing this -- but this would be best posed as a new question, you can even link this answer in your question (welcome to StackOverflow btw! - Hooked 2018-04-19 17:47


2

It's also possible to hide a subplot using the Axes.set_visible() method.

import matplotlib.pyplot as plt
import pandas as pd

fig = plt.figure()
data = pd.read_csv('sampledata.csv')

for i in range(0,6):
ax = fig.add_subplot(3,2,i+1)
ax.plot(range(1,6), data[i])
if i == 5:
    ax.set_visible(False)
2017-04-10 20:19
by Nick Hunkins


1

Would it be an option to create the subplots when you need them?

import matplotlib
matplotlib.use("pdf")
import matplotlib.pyplot as plt

plt.figure()
plt.gcf().add_subplot(421)
plt.fill([0,0,1,1],[0,1,1,0])
plt.gcf().add_subplot(422)
plt.fill([0,0,1,1],[0,1,1,0])
plt.gcf().add_subplot(423)
plt.fill([0,0,1,1],[0,1,1,0])
plt.suptitle("Figure Title")
plt.gcf().subplots_adjust(hspace=0.5,wspace=0.5)
plt.savefig("outfig")
2012-04-05 20:42
by moooeeeep
I don't think so because there are other formatting things I need to do that I didn't include in the original question for brevity. One of these is plt.subplots_adjust(wspace=0,hspace=0). I'm not sure that would work after the fact - mishaF 2012-04-05 20:44
@mishaF : you can do subplots_adjust() using this approach. See my edit - moooeeeep 2012-04-05 20:54
sure enough - that works fine! Thanks tons! - mishaF 2012-04-05 20:57
Ads