我使用状态模型的irf函数生成一个图。然后,我使用ax1 = fig.add_subplot(211)
向该图形添加一个子图。代码看起来像:
irf = results.irf()
fig = irf.plot( plot_stderr= False, impulse = columns[1], response = columns[0])
ax1 = fig.add_subplot(211)
ax1.plot(df[columns].dropna().index, df[columns].dropna().iloc[:, 1], color='red')
ax1.tick_params(axis='y', labelcolor='red')
ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis
ax2.plot(df[columns].dropna().index, df[columns].dropna().iloc[:, 0], color='blue')
ax2.tick_params(axis='y', labelcolor='blue')
plt.subplots_adjust(hspace = 10)
这就产生了:
Problem:如您所见,较低的图(irf图)被剪掉了。当我添加plt.subplots_adjust(hspace = 10)
时,我得到:
这在一定程度上有所帮助,但代价是减少顶部子图的大小,这是不可取的。
问题:如何在没有剪报的情况下得到大小相等的两个子图。我希望我可以从fig, (ax1, ax2) = plt.subplots(2,1)
开始,然后将ax1传递给irf.plot()。那我就可以控制两把斧头了。但是显然没有办法将ax传递给irf.plot()。它只是创造了自己的形象。如果有办法的话,我甚至会满意地把这两个数字分开,然后加入它们,并把它们作为一个数字来保存。
发布于 2021-09-20 07:38:54
这里的基本问题是,irf.plot
正在创建一个有一个子图的图形(一行、一列)。然后,使用add_subplot(211)
添加第二个子图,它告诉matplotlib将其安排在2行配置的顶部行中。但是原来的子图没有被修改,所以它的一部分被新子图(ax1
)隐藏。
据我所见,在创建时,irf.plot
似乎没有任何选项来控制这一点。
但是我们可以做的是在创建后使用GridSpec
修改子图位置(例如在这个答案中),然后添加新的子图。
例如,类似这样的东西可能会奏效:
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
irf = results.irf()
fig = irf.plot(plot_stderr=False, impulse=columns[1], response=columns[0])
# Change position of irf plot axes
ax_irf = fig.get_axes()[0]
gs = gridspec.GridSpec(nrows=2, ncols=2)
ax_irf.set_position(gs[0, 0].get_position(fig))
ax_irf.set_subplotspec(gs[0, 0]) # this might be superfluous
# Now add second subplot
ax1 = fig.add_subplot(gs[1, 0])
ax1.plot(df[columns].dropna().index, df[columns].dropna().iloc[:, 1], color='red')
ax1.tick_params(axis='y', labelcolor='red')
ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis
ax2.plot(df[columns].dropna().index, df[columns].dropna().iloc[:, 0], color='blue')
ax2.tick_params(axis='y', labelcolor='blue')
https://stackoverflow.com/questions/69256787
复制相似问题