向 matplotlib 图和轴实例添加自定义属性:不明智?

Luk*_*vis 5 python matplotlib python-3.x matplotlib-basemap

我注意到我可以将自己的属性添加到matplotlib.axes.Axes()实例中matplotlib.figure.Figure()。例如,

import matplotlib as mpl
fig = mpl.figure.Figure()
ax = fig.add_subplot()
ax.foo = 'bar'
Run Code Online (Sandbox Code Playgroud)

实际上,我可能想使用类似的方法将底图实例添加到坐标区对象

import mpl_toolkits.basemap as basemap    
ax.basemap = basemap.Basemap('mollweide', ax=ax)
Run Code Online (Sandbox Code Playgroud)

这样我就可以以更加面向对象、直观的方式添加地理特征。这是这些对象的记录/可靠特征,还是偶然?换句话说,我可以“安全”地使用它吗?

Ser*_*ity 2

根据此示例,您可以为自定义Figure 类添加任何新属性。然而对于 Axes 类来说,这样的任务更加复杂。你必须创建自己的 Axes 类

from matplotlib.pyplot import figure, show
from matplotlib.figure import Figure
from matplotlib.axes import Subplot
from mpl_toolkits.basemap import Basemap   

# custom Figure class with foo property  
class MyFigure(Figure):
    def __init__(self, *args, **kwargs):
        self.foo = kwargs.pop('foo', 'bar')
        Figure.__init__(self, *args, **kwargs)

# custom Axes class  
class MyAxes(Subplot):
    def __init__(self, *args, **kwargs):
        super(MyAxes, self).__init__(*args, **kwargs)

    # add my axes 
    @staticmethod
    def from_ax(ax=None, fig=None, *args, **kwargs):
        if ax is None:
            if fig is None: fig = figure(facecolor='w', edgecolor='w')
            ax = MyAxes(fig, 1, 1, 1, *args, **kwargs)
            fig.add_axes(ax)
        return ax

# test run
# custom figure
fig = figure(FigureClass=MyFigure, foo='foo')
print (type(fig), fig.foo)

# add to figure custom axes
ax = MyAxes.from_ax(fig=fig)
print (type(fig.gca()))

# create Basemap instance and store it to 'm' property
ax.m = Basemap(llcrnrlon=-119, llcrnrlat=22, urcrnrlon=-64, urcrnrlat=49, 
 projection='lcc', lat_1=33, lat_2=45, lon_0=-95, resolution='c')
ax.m.drawcoastlines(linewidth=.25)
ax.m.drawcountries(linewidth=.25)
ax.m.fillcontinents(color='coral', lake_color='aqua')

print (ax.m)
show()
Run Code Online (Sandbox Code Playgroud)

输出:

<class '__main__.MyFigure'> foo
<class '__main__.MyAxes'>
<mpl_toolkits.basemap.Basemap object at 0x107fc0358>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

然而我的观点是你不需要创建maxes类的属性。您必须根据自定义轴类中的底图__init___(或创建特殊方法,如set_basemap)来调用所有函数。