您需要先了解一些架构
matplotlib(请参阅此处,了解创始人和当前主要开发人员的长篇文章)。在
backend处理渲染和与硬件对话的层的底部。在该层的顶部
artists,其知道如何绘制通过告诉他们的自我
backend对象做什么。在该层的顶层是模仿的
pyplot状态机接口
MATLAB。
您在图中看到的所有内容在内部都以表示,
Artist并且艺术家可以包含其他艺术家。例如,
Axes对象跟踪子对象,即
Artists刺,children,标签,线条或图像等轴,而
Axes对象则是对象的子
Figure对象。当您(通过
fig.canvas.draw())告诉人物自己绘画时,所有的子代画家都是递归绘制的。
这种设计的一个缺点是,给定的an实例
Artist可以恰好在一个图形中(并且很难在图形之间移动它们),因此您无法创建
AxesImage对象然后继续重复使用它。
这种设计也将
Artists已知信息分开。
Axes对象了解tick的位置,标签和显示范围(通过了解
Axis对象来实现,但这会使杂草更多)。像
vmin和
vmax封装在
Normalize(doc)对象中,以进行
AxesImage跟踪。这意味着您将需要分开处理列表中所有内容的方式。
我建议在这里使用工厂式模式或咖喱式模式
类工厂:
def set_up_axes(some, arguements): ''' Factory to make configured axes ( ''' fig, ax = plt.subplots(1, 1) # or what ever layout you want ax.set_*(...) return fig, axmy_norm = matplotlib.colors.Normalize(vmin, mmax) # or write a factory to do fancier stufffig, ax = set_up_axes(...)ax.imshow(..., norm=my_norm)fig2, ax2 = set_up_axes(...)ax2.imshow(..., norm=mynorm)
您可以包装一整套kwarg,以方便地按如下方式重复使用它们:
my_imshow_args = {'extent':[...], 'interpolation':'nearest', 'norm': my_norm, ...}ax2.imshow(..., **my_imshow_args)
咖喱状:
def my_imshow(im, ax=None, *args, **kwargs): if ax is None: ax = plt.gca() # do all of your axes set up ax.set_xlim(..) # set default vmin and vmax # you can drop some of these conditionals if you don't want to be # able to explicitly override the defaults if 'norm' not in kwargs: vmin = kwargs.pop('vmin', None) vmax = kwargs.pop('vmax', None) if vmin is None: vmin = default_vmin # or what ever if vmax is None: vmax = default_vmax my_norm = matplotlib.colors.Normalize(vmin, mmax) kwargs['norm'] = norm # add a similar block for `extent` # or any other kwargs you want to change the default of ax.figure.canvas.draw() # if you want to force a re-draw return ax.imshow(im, *args, **kwargs)
如果您想变得聪明,可以
plt.imshow使用您的版本进行猴子补丁
plt.imshow = my_imshow
还有一个rcParams接口,它允许您以
matplotlib全局方式更改许多位的默认值。
还有另一种方法(通过
partial)来完成此任务
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)