Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Large number of subplots with matplotlib

I would like to create plot with many (100) subplots with Python matplotlib. I cannot find appropriate syntax for it:

I would like something like (this is not working)

plt.subplot(10,10,i,X1, Y) 

in a loop with i from 0 to 99, then

plt.show()

Syntax is available in many tutorials for case when there are only few subplots. Then, syntax can be

plt.close('all')
fig = plt.figure()

ax1 = plt.subplot(221)
ax2 = plt.subplot(223)
ax3 = plt.subplot(122)

example_plot(ax1)
example_plot(ax2)
example_plot(ax3)

plt.tight_layout()

code is from here.

For my problem, I guess that I cannot use the same syntax, as I would have plt.subplot(10101), etc., which I don't understand.

Do you have a solution?

Thanks

like image 429
kiriloff Avatar asked Nov 13 '12 17:11

kiriloff


People also ask

How do you plot 4 subplots in Python?

To create multiple plots use matplotlib. pyplot. subplots method which returns the figure along with Axes object or array of Axes object. nrows, ncols attributes of subplots() method determine the number of rows and columns of the subplot grid.

How do I make more space between subplots in Matplotlib?

We can use the plt. subplots_adjust() method to change the space between Matplotlib subplots. The parameters wspace and hspace specify the space reserved between Matplotlib subplots. They are the fractions of axis width and height, respectively.

How do I increase subplot size?

To change figure size of more subplots you can use plt. subplots(2,2,figsize=(10,10)) when creating subplots.


4 Answers

Try this:

fig, ax = plt.subplots(10, 10)

where ax will contain one hundred axis in a list (of lists).

It is a really handy function, from the docs:

Definition: plt.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, **fig_kw)
Create a figure with a set of subplots already made.

This utility wrapper makes it convenient to create common layouts of
subplots, including the enclosing figure object, in a single call.
like image 129
jorgeca Avatar answered Oct 23 '22 02:10

jorgeca


Here's a fully working code solution that shows how things are numbered, since it looks like people still come to look here:

columns = 10
rows = 4
fig, ax_array = plt.subplots(rows, columns,squeeze=False)
for i,ax_row in enumerate(ax_array):
    for j,axes in enumerate(ax_row):
        axes.set_title('{},{}'.format(i,j))
        axes.set_yticklabels([])
        axes.set_xticklabels([])
#         axes.plot(you_data_goes_here,'r-')
plt.show()

Which outputs this to show you how the numbering works (I only did 4 row instead of 10 to make the picture a bit smaller, just change "rows" to 10 to get 10 rows of subplots):

Matplotlib array of subplots

The numbering shows you what i and j values you'll have at each position so you can line things up the way you want in the array of matplotlib subplots. This incorporates subplotting in arrays for whatever layout you'd like.

like image 12
Ezekiel Kruglick Avatar answered Oct 23 '22 00:10

Ezekiel Kruglick


Your example is almost correct. Please use:

for i in range(100):
    ax = plt.subplot(10,10,i)
    ax.plot(...)
like image 9
btel Avatar answered Oct 23 '22 00:10

btel


If you are trying to generate ~100 subplots, as a practical matter you may want to do something like this which will run much faster. You give up have individual axes labels, but with 100 subplots, unless you are making huge print outs you won't be able to read the labels anyway.

like image 4
tacaswell Avatar answered Oct 23 '22 02:10

tacaswell