2012-07-27 14 views
18

El códigoHay una matplotlib.axes.AxesSubplot clase, pero los matplotlib.axes módulo tiene ningún atributo AxesSubplot

import matplotlib.pyplot as plt 
fig = plt.figure() 
ax = fig.add_subplot(111) 
print type(ax) 

da la salida

<class 'matplotlib.axes.AxesSubplot'> 

continuación, el código

import matplotlib.axes 
matplotlib.axes.AxesSubplot 

plantea la excepción

AttributeError: 'module' object has no attribute 'AxesSubplot' 

En resumen, existe una clase matplotlib.axes.AxesSubplot, pero el módulo matplotlib.axes no tiene el atributo AxesSubplot. ¿Qué diablos está pasando?

Estoy usando Matplotlib 1.1.0 y Python 2.7.3.

+0

¿Hay un problema real que está tratando de resolver con esto, o es esta pregunta solo curiosidad? – Julian

+3

@Julian: es "solo curiosidad". Creo que la curiosidad te hace un mejor desarrollador. – user763305

Respuesta

19

Heh. Esto se debe a que es no AxesSubplot clase ... hasta que se necesita uno, cuando uno se compila desde SubplotBase. Esto se hace por arte de magia en axes.py:

def subplot_class_factory(axes_class=None): 
    # This makes a new class that inherits from SubplotBase and the 
    # given axes_class (which is assumed to be a subclass of Axes). 
    # This is perhaps a little bit roundabout to make a new class on 
    # the fly like this, but it means that a new Subplot class does 
    # not have to be created for every type of Axes. 
    if axes_class is None: 
     axes_class = Axes 

    new_class = _subplot_classes.get(axes_class) 
    if new_class is None: 
     new_class = new.classobj("%sSubplot" % (axes_class.__name__), 
           (SubplotBase, axes_class), 
           {'_axes_class': axes_class}) 
     _subplot_classes[axes_class] = new_class 

    return new_class 

Así que está hecho sobre la marcha, pero es una subclase de SubplotBase:

>>> import matplotlib.pyplot as plt 
>>> fig = plt.figure() 
>>> ax = fig.add_subplot(111) 
>>> print type(ax) 
<class 'matplotlib.axes.AxesSubplot'> 
>>> b = type(ax) 
>>> import matplotlib.axes 
>>> issubclass(b, matplotlib.axes.SubplotBase) 
True 
+1

¿No debería crearse la clase cuando ejecuto el primer fragmento de código y estar presente como un atributo de matplotlib.axes cuando ejecuto el segundo fragmento de código? – user763305

+3

It * is * created, pero no se almacena a nivel de módulo. Busque en 'matplotlib.axes._subplot_classes': debería ver' {matplotlib.axes.Axes: matplotlib.axes.AxesSubplot} '. Tenga en cuenta que en la función de fábrica se agrega 'new_class' al diccionario' _subplot_classes'. – DSM

Cuestiones relacionadas