2013-11-16 4 views
3

У меня есть проблемы с доступом к существующему подзаговору в фигуре Matplotlib при указании местоположений участков с использованием gridspec напрямую или, альтернативно, subplot2grid. Регулярные спецификации подзаголовков, например. add_subplot (211), возвращает существующие оси, если они есть. Использование gridspec/subplot2grid, похоже, уничтожает любые существующие оси. Как получить существующие объекты осей с помощью gridspec/subplot2grid? Является ли это предполагаемым поведением или я что-то упустил? Я хотел бы получить решение, где мне не нужно определять собственные заполнители для объектов осей.Как существующие оси подзаголовка извлекаются с использованием subplot2grid/gridspec в Matplotlib?

Пример:

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() 
+0

Самый простой способ - просто сохранить ссылку на них самостоятельно. – tacaswell

+0

Да, легко сделано, и я догадываюсь, что до сих пор буду придерживаться этого решения. Единое поведение для add_plot и т. Д. Для различных способов указания формата подзадачи по-прежнему требуется, хотя ИМО. – bach

+0

Лучшее место, чтобы выразить эту точку зрения в вопросе о github;) – tacaswell

ответ

3

Это на самом деле тонкая ошибка с магией, как add_subplot определяет, является ли оси существует. Она сводится к этому факту:

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

, который из-за gridspec.__getitem__ возвращает новый объект каждый раз, когда вы называете его и SubplotSpec не перегружать __eq__ около того питоном проверки «это тот же объект в памяти» при поиске существующих осей ,

Это то, что это неправильно, однако моя наивная попытка исправить это путем добавления __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): в matplotlib/gridspec.py ~ L380 и переустановке от источника работает, как ожидалось.

PR to fix this который, кажется, разрушает всевозможные другие вещи.

+0

Благодарим вас за разъяснения и усилия по исправлению проблемы. – bach

 Смежные вопросы

  • Нет связанных вопросов^_^