我正在制作带有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)
修改
我可以使用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)
答案 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()