matplotlib:隐藏子图并用其他子图填充空间

Fel*_*lix 9 python matplotlib

我有一个包含三个垂直排列的子图的图形.一旦我点击图中,我想要ax2隐藏第二个子图,而另一个图则填充空间.再次点击图中应恢复原始图和布局.

隐藏子情节ax2不是问题,但如何重新排列其他子图的位置?

我尝试GridSpec使用set_position和set_subplotspec方法创建一个新的,但没有任何结果.我确定我在这里遗漏了一些东西,任何帮助都会受到赞赏.

这是我的代码:

import matplotlib.pyplot as plt
from matplotlib import gridspec

fig = plt.figure()

gs = gridspec.GridSpec(3, 1, height_ratios=[5, 2, 1])
ax1 = fig.add_subplot(gs[0])
ax2 = fig.add_subplot(gs[1], sharex=ax1)
ax3 = fig.add_subplot(gs[2], sharex=ax2)

visible = True

def toggle_ax2(event):
    global visible
    visible = not visible
    ax2.set_visible(visible)
    plt.draw()

fig.canvas.mpl_connect('button_press_event', toggle_ax2)
plt.show()
Run Code Online (Sandbox Code Playgroud)

Imp*_*est 11

您可以定义两个不同的GridSpecs.一个将有3个子图,另一个2.根据中轴的可见性,您可以更改其他两个轴的位置以服从第一个或第二个GridSpec.
(不需要任何虚拟数字,就像其他答案可能暗示的那样.)

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

fig = plt.figure()

gs = gridspec.GridSpec(3, 1, height_ratios=[5, 2, 1], hspace=0.3)
gs2 = gridspec.GridSpec(2,1, height_ratios=[5,3])

ax1 = fig.add_subplot(gs[0])
ax2 = fig.add_subplot(gs[1], sharex=ax1)
ax3 = fig.add_subplot(gs[2], sharex=ax2)

ax1.plot([1,2,3], [1,2,3], color="crimson")
ax2.plot([1,2,3], [2,3,1], color="darkorange")
ax3.plot([1,2,3], [3,2,1], color="limegreen")

visible = True

def toggle_ax2(event):
    global visible
    visible = not visible
    ax2.set_visible(visible)
    if visible:
        ax1.set_position(gs[0].get_position(fig))
        ax3.set_position(gs[2].get_position(fig))
    else:
        ax1.set_position(gs2[0].get_position(fig))
        ax3.set_position(gs2[1].get_position(fig))

    plt.draw()

fig.canvas.mpl_connect('button_press_event', toggle_ax2)
plt.show()
Run Code Online (Sandbox Code Playgroud)

左:原创; 右:点击后

在此输入图像描述