Python 3.x matplotlib中的子类轴

Python 3.x matplotlib中的子类轴,python-3.x,matplotlib,Python 3.x,Matplotlib,标题差不多就是这么说的。 但是,按照matplotlib的设置方式,不可能简单地从轴继承并使其工作。 Axis对象从不直接使用,通常仅从对子批或其他函数的调用中返回 我想这样做有几个原因。 首先,一次又一次地减少具有相似参数的复制图。 大概是这样的: class LogTemp(plt.Axes): """ Axes to display temperature over time, in logscale """ def __init__(self, *args, **kwar

标题差不多就是这么说的。 但是,按照matplotlib的设置方式,不可能简单地从轴继承并使其工作。 Axis对象从不直接使用,通常仅从对子批或其他函数的调用中返回

我想这样做有几个原因。 首先,一次又一次地减少具有相似参数的复制图。 大概是这样的:

class LogTemp(plt.Axes):
    """ Axes to display temperature over time, in logscale """
    def __init__(self, *args, **kwargs):
        super.__init__(*args, **kwargs)
        self.set_xlabel("Time (s)")
        self.set_ylabel("Temperature(C)")
        self.set_yscale('log')
为此编写一个自定义函数并不困难,尽管它没有那么灵活。 更大的原因是我想覆盖一些默认行为。 作为一个非常简单的示例,请考虑

class Negative(plt.Axes):
     """ Plots negative of arguments """
     def plot(self, x, y, *args, **kwargs):
         super().plot(x, -y, *args, **kwargs)

如果使用函数,尝试修改行为的多个方面将很快变得混乱

但是,我还没有找到让matplotlib轻松处理新Axis类的方法。 医生们在我见过的任何地方都没有提到。 从Figure类继承的问题地址。 然后可以将自定义类传递到某些matplotlib函数中。 一个未回答的问题表明轴心并没有那么简单


更新:可以使用monkey patch matplotlib.axes.axes覆盖默认行为,但这只能在第一次执行程序时执行一次。使用这种方法不可能使用多个自定义轴。

我发现了一种关于的好方法。 他们的目标是一个没有记号或标记的Axis对象,这大大加快了创建时间。 可以使用matplotlib注册投影,然后使用这些投影

对于我给出的例子,它可以通过

class Outliers(plt.Axes):
    """ Highlight outliers in plotted data """
    name = 'outliers'
    def plot(self, x, y, **kwargs):
         out = abs(y - y.mean()) > 3*y.std()
         super().plot(x, y, **kwargs)
         super().plot(x[out], y[out], marker='x', linestyle='', **kwargs)

import matplotlib.projections as proj
proj.register_projection(Outliers)
然后它就可以被

ax = f.add_subplot(1, 1, 1, projection='outliers')


所需的唯一更改是类定义中的名称变量,然后将该名称传递到subplot的投影参数中。

matplotlib文档中有一个如何创建自定义轴的示例:还有一个完整的。例如,可以找到一个用例。最后,我认为这与@ImportanceOfBeingErnest几乎相同,非常相似。这个问题是如何修改已经实例化的实例,尽管您的答案涵盖了这里的情况。
ax = f.add_subplot(1, 1, 1, projection='outliers')
fig, axes = plt.subplots(20,20, subplot_kw=dict(projection='outliers'))