当有多个子图时,matplotlib的InsetPosition会出现问题

时间:2017-12-12 20:36:07

标签: python matplotlib subplot

我正在制作带有3个子图的图形,其中每个我想要一个插入轴,但是对于我的代码,它只为最后一个子图创建插入轴。你能帮帮我吗?感谢。

import pylab as pl
from mpl_toolkits.axes_grid1.inset_locator import InsetPosition

def test(ax_main, pos, Data):
    ax2 = pl.axes([0, 0, 1, 1])
    ip = InsetPosition(ax_main, pos)
    ax2.set_axes_locator(ip)
    pl.hist(Data)

for i in range(3):
    ax=pl.subplot(1,3,i+1)
    Data = pl.rand(100)
    ax.plot(Data)
    test(ax, [.3,.3,.6,.6], Data)

here is the result: (picture)

修改

我可以使用inset_axes解决这个问题:

from mpl_toolkits.axes_grid.inset_locator import inset_axes
def test(ax_main, pos, Data):
    ax2 = inset_axes(ax_main, weight=pos[2], height=pos[3])  # weight and height are not important here because they will be changed in the next lines
    ip = InsetPosition(ax_main, pos)
    ax2.set_axes_locator(ip)
    pl.hist(Data)

for i in range(3):
    ax=pl.subplot(1,3,i+1)
    Data = pl.rand(100)
    ax.plot(Data)
    test(ax, [.3,.3,.6,.6], Data)

1 个答案:

答案 0 :(得分:0)

这里有两个问题。第一个是可以理解的。正如documentation of figure.add_axes所说:

  

如果图中已经有一个具有相同参数的轴,那么它只会使轴成为当前轴并返回它。自Matplotlib 2.1起,此行为已被弃用。同时,如果您不想要这种行为(即,您想强制创建新Axes),则必须使用一组唯一的args和kwargs。轴标签属性已经公开用于此目的:如果您希望将两个相同的轴添加到图中,请确保为它们指定唯一标签。

这意味着如果多次调用plt.axes([0, 0, 1, 1]),它毕竟不会创建新轴。解决方案是添加标签,例如通过将循环变量i与数据一起提供给函数并调用

plt.axes([0, 0, 1, 1], label=str(i))

不幸的是,这还不够,上面的内容仍无法正常工作。这对我来说是不可理解的。然而,通过反复试验,可以发现对轴的初始位置使用不同的坐标使得这工作成功。我正在使用ax2 = plt.axes([0.0, 0.0, 0.1, 0.1], label=str(i)),但是[0.2, 0.0, 0.5, 0.1]似乎也可行,而[0.2, 0.2, 0.5, 0.1]则不起作用。更奇怪的是,[0.0, 0.2, 0.5, 0.1]会在第二个和第三个图中创建一个插图,但不会在第一个图中创建。

所有这些看起来有点武断,但足以解决问题:

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import InsetPosition

def test(ax_main, pos, Data,i):
    ax2 = plt.axes([0.0, 0.0, 0.1, 0.1], label=str(i))
    ip = InsetPosition(ax_main, pos)
    ax2.set_axes_locator(ip)
    ax2.plot(Data)


for i in range(3):
    ax=plt.subplot(1,3,i+1)
    test(ax, [.3,.3,.6,.6], [1,2], i)

plt.show()

enter image description here