Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
819 views
in Technique[技术] by (71.8m points)

python - how to use GridSpec() with FuncAnimation in matplotlib?

Well, I want to make an animation which can show 4 different distributions, but when I use gridspec to make subplots, it doesn't work, the code is below:

import matplotlib.animation as animation
import matplotlib.pyplot as plt
import numpy as np

%matplotlib notebook

x1 = np.random.normal(-2.5, 1, 10000)
x2 = np.random.gamma(2, 1.5, 10000)
x3 = np.random.exponential(2, 10000)+7
x4 = np.random.uniform(14,20, 10000)

x = [x1, x2, x3, x4]

bins1 = np.arange(-7.5, 2.5, 0.2)
bins2 = np.arange(0, 10, 0.2)
bins3 = np.arange(7, 17, 0.2)
bins4 = np.arange(12, 22, 0.2)
bins = [bins1, bins2, bins3, bins4]

axis1 = [-7.5, 2.5, 0, 0.6]
axis2 = [0, 10, 0, 0.6]
axis3 = [7, 17, 0, 0.6]
axis4 = [12, 22, 0, 0.6]
axis = [axis1, axis2, axis3, axis4]

import matplotlib.gridspec as gridspec

gspec = gridspec.GridSpec(4, 4)
plt.figure()
ax1 = plt.subplot(gspec[0:2, 0:2])
ax2 = plt.subplot(gspec[0:2, 2:])
ax3 = plt.subplot(gspec[2:, 2:])
ax4 = plt.subplot(gspec[2:, 0:2])
ax = [ax1, ax2, ax3, ax4] 
for a in ax:
    a.spines['right'].set_visible(False)
    a.spines['top'].set_visible(False)
gspec.update(wspace = .6, hspace = .6)

def update(curr):
    if curr == 500:
        a.event_source.stop()
    for i in range(len(ax)):
        ax[i].cla()
        ax[i].hist(x[i][:curr], normed = True, bins = bins[i])
        ax[i].axis(axis[i])
        ax[i].set_title('n={}'.format(curr))
        ax[i].set_ylabel('Normed Frequency')
    plt.tight_layout()

fig = plt.gcf()    
a = animation.FuncAnimation(fig, update, interval = 10)

in this case, the animation doesn't work, but the funny thing is if I use

fig, ((ax1,ax2),(ax3, ax4)) = plt.subplots(2, 2, sharey = True)
ax = [ax1, ax2, ax3, ax4]

to make ax1,ax2,ax3,ax4 and don't change anything else, the code works well, so are there some details need to know when using gridspec?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The GridSpec arguments wspace and hspace are incompatible with plt.tight_layout. You can either use tight_layout or specify the spacings.

If you want to use GridSpec you have two options:

  • remove the line plt.tight_layout
  • remove the line gspec.update(wspace = .6, hspace = .6)

The reason

fig, ((ax1,ax2),(ax3, ax4)) = plt.subplots(2, 2, sharey = True)
ax = [ax1, ax2, ax3, ax4]

works is therefore that you don't set any wspace or hspace.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...