直接使用gridspec或subplot2grid指定绘图位置时,在访问Matplotlib图中的现有子绘图时遇到问题。常规子图规范,例如add_subplot(211),返回现有轴(如果有)。使用gridspec/subplot2grid似乎会破坏任何现有的轴。如何使用gridspec/subplot2grid检索现有的轴对象?这是预期的行为还是我在这里错过了一些东西?我想要一个不必为axis对象定义自己的占位符的解决方案。

例子:

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

x = np.linspace(0,10,100)
y1 = np.cos(x)
y2 = np.sin(x)

fig = plt.figure()
ax = fig.add_subplot(211)
ax.plot(x,y1, '-b')
ax = fig.add_subplot(212)
ax.plot(x,y2, '-b')
ax = fig.add_subplot(211) #here, the existing axes object is retrieved
ax.plot(x,y2, '-r')

fig = plt.figure()
gs = gridspec.GridSpec(2,1)
ax = fig.add_subplot(gs[0,0])
ax.plot(x,y1, '-b')
ax = fig.add_subplot(gs[1,0])
ax.plot(x,y2, '-b')
# using gridspec (or subplot2grid), existing axes
# object is apparently deleted
ax = fig.add_subplot(gs[0,0])
ax.plot(x,y2, '-r')

plt.show()

最佳答案

这实际上是一个微妙的错误,它具有add_subplot如何确定a轴是否存在的魔力。归结为以下事实:

In [220]: gs[0, 0] == gs[0, 0]
Out[220]: False

这是因为gridspec.__getitem__每次调用时都会返回一个新对象,并且SubplotSpec不会使__eq__重载,因此python在搜索现有轴时会检查“此对象是否在内存中”。

那是错的,但是我天真地尝试通过在__eq__中添加SubplotSpec和猴子补丁matplotlib.gridspec.SubplotSpec来解决此问题(我没有时间弄清楚为什么),但是如果您添加
def __eq__(self, other):
    return all((self._gridspec == other._gridspec,
                self.num1 == other.num1,
                self.num2 == other.num2))

class SubplotSpec(object):〜L380中的matplotlib/gridspec.py,并按预期从源进行重新安装。

PR to fix this似乎破坏了其他所有东西。

关于matplotlib - 如何在Matplotlib中使用subplot2grid/gridspec检索现有的子图轴?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20017314/

10-12 19:54