直接使用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()
Run Code Online (Sandbox Code Playgroud)
add_subplot这实际上是一个微妙的错误,它具有如何确定轴是否存在的魔力。归根结底是这样一个事实:
In [220]: gs[0, 0] == gs[0, 0]
Out[220]: False
Run Code Online (Sandbox Code Playgroud)
这是因为gridspec.__getitem__每次调用它时都会返回一个新对象并且SubplotSpec不会重载__eq__,因此 python 在搜索现有轴时会检查“这是否是内存中的同一对象”。
这就是问题所在,但是我天真的尝试通过向 a 添加__eq__a来修复它SubplotSpec,并且猴子修补matplotlib.gridspec.SubplotSpec不起作用(我没有时间弄清楚为什么),但是如果您添加
def __eq__(self, other):
return all((self._gridspec == other._gridspec,
self.num1 == other.num1,
self.num2 == other.num2))
Run Code Online (Sandbox Code Playgroud)
到~L380 并从源class SubplotSpec(object):代码matplotlib/gridspec.py重新安装按预期工作。
PR 来解决这个问题,这似乎破坏了其他各种事情。
| 归档时间: |
|
| 查看次数: |
1830 次 |
| 最近记录: |