向 matplotlib Figure 和 Axes 实例添加自定义属性:不明智?
Adding custom attributes to matplotlib Figure and Axes instances: ill-advised?
我注意到我可以将自己的属性添加到 matplotlib.axes.Axes()
和 matplotlib.figure.Figure()
实例。例如,
import matplotlib as mpl
f = mpl.figure.Figure()
a = f.add_subplot()
a.foo = 'bar'
实际上,我可能想使用
之类的东西将 basemap 实例 添加到轴对象
import mpl_toolkits.basemap as basemap
a.basemap = basemap.Basemap('mollweide', ax=a)
这样我就可以以更面向对象、更直观的方式添加地理特征。这是这些对象的 documented/reliable 特征,还是偶然的?也就是说,我可以"safely"使用这个吗?
根据此 example 您可以为自定义图 class 添加任何新的 属性。但是对于 Axes class 这样的任务更复杂。你必须自己制作 Axes class
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()
输出:
<class '__main__.MyFigure'> foo
<class '__main__.MyAxes'>
<mpl_toolkits.basemap.Basemap object at 0x107fc0358>
但是我的意见是您不需要制作 m
属性 个轴 class。您必须根据自定义轴 class 中的底图调用所有函数,即在 __init___
中(或制作特殊方法,如 set_basemap
)。
我注意到我可以将自己的属性添加到 matplotlib.axes.Axes()
和 matplotlib.figure.Figure()
实例。例如,
import matplotlib as mpl
f = mpl.figure.Figure()
a = f.add_subplot()
a.foo = 'bar'
实际上,我可能想使用
之类的东西将 basemap 实例 添加到轴对象import mpl_toolkits.basemap as basemap
a.basemap = basemap.Basemap('mollweide', ax=a)
这样我就可以以更面向对象、更直观的方式添加地理特征。这是这些对象的 documented/reliable 特征,还是偶然的?也就是说,我可以"safely"使用这个吗?
根据此 example 您可以为自定义图 class 添加任何新的 属性。但是对于 Axes class 这样的任务更复杂。你必须自己制作 Axes class
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()
输出:
<class '__main__.MyFigure'> foo
<class '__main__.MyAxes'>
<mpl_toolkits.basemap.Basemap object at 0x107fc0358>
但是我的意见是您不需要制作 m
属性 个轴 class。您必须根据自定义轴 class 中的底图调用所有函数,即在 __init___
中(或制作特殊方法,如 set_basemap
)。