Python 如何模拟xarray的绘图功能?

Python 如何模拟xarray的绘图功能?,python,monkeypatching,Python,Monkeypatching,我试图修补xarray的DataArray,以提供类似但有所不同的绘图方法。因为这很难解释,这里有一个例子: 导入matplotlib.pyplot作为plt 将xarray作为xr导入 airtemps=xr.tutorial.open_数据集(“空气温度”) da=airtemps.air.isel(时间=0) da.plot()#绘制某物 da.plot.imshow() 我正在尝试引入新的方法,这些方法将起到同样的作用 da.pplot() da.pplot.imshow()#将与im

我试图修补xarray的DataArray,以提供类似但有所不同的绘图方法。因为这很难解释,这里有一个例子:

导入matplotlib.pyplot作为plt
将xarray作为xr导入
airtemps=xr.tutorial.open_数据集(“空气温度”)
da=airtemps.air.isel(时间=0)
da.plot()#绘制某物
da.plot.imshow()
我正在尝试引入新的方法,这些方法将起到同样的作用

da.pplot()
da.pplot.imshow()#将与imshow一起绘图
但我没能做到。让第一个开始工作很容易,但第二个更难。这是我试过的东西

def pplot(darray,**kwargs):
打印(“打印前做一些事情…”)
返回darray.plot(**kwargs)
xr.DataArray.pplot=pplot
def imshow(darray,**kwargs):
打印(“在使用imshow打印之前做一些事情…”)
返回darray.plot.imshow(**kwargs)
xr.DataArray.pplot.imshow=imshow
但第二个显然是不对的:

[5]中的
:da.pplot()
在策划之前做一些事情。。。
出[5]:
在[6]中:da.pplot.imshow()
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在里面
---->1 da.pplot.imshow()
TypeError:imshow()缺少1个必需的位置参数:“darray”
我也尝试过使用类来实现这一点(我认为这是正确的方法),但这对我来说也是失败的:

类pplotBase(对象):
__全部
定义初始化(自):
返回
定义呼叫(自我,**kwds):
"""
"""
返回自绘制(**kwds)
def imshow(自身,**千瓦时):
打印(“显示”)
返回self.plot.imshow(**kwds)
xr.DataArray.pplotBase=pplotBase
有什么想法吗

编辑

这是我最近一次尝试使用基于@wjandrea答案的类

如果我创建一个
绘图
实例,我可以执行以下操作:

[50]中的
:plot=da.plot
在[51]中:plot.uuu init_uuuuuuuuuuuuuuuuuuuuu(plot.u da)#这可以正常工作和绘图
但是,如果我创建一个类来在启动时执行类似的操作,我会得到以下结果:

[61]中的
:将xarray作为xr导入
…:类pplot(xr.DataArray.plot):
...: 
…:def_uuuinit_uuu(self,*args,**kwargs):
…:打印(“打印前做事情”)
…:打印(直接(自))
…:super()
…:通过
...: 
…:@classmethod
…:def imshow(*args,**kwargs):
…:打印(“在显示之前做事情”)
…:return super().imshow(*args,**kwargs)
…:xr.DataArray.pplot=pplot
...: 
在[62]中:da.pplot()
在策划之前先做些事情
“UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU","新","减少","减少","减少","减少","模块","设置属性","大小","插槽","strk_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在里面
---->1 da.pplot()
在uuu init_uuuuu中(self,*args,**kwargs)
5打印(“打印前做事情”)
6打印(直接(自我))
---->7 super().\uuuu init\uuuuu(self.\u da,*args,**kwargs)
8通
9
属性错误:_da
对我来说,这没有什么意义,因为我正在测试
\uuu init\uuu()
方法中的
self
的属性和方法,其中显然有一个
\u da
。所以我不知道为什么我不能访问它


我想我的困惑是:如何访问用于从类的方法创建类的
DataArray的
plot
实例?

类是正确的方法,但您需要使用继承,使用
\uuu init\uuuuuuuuuuuuuuuuuuuuu>而不是
\uuuuuuuuuuuuuuuuuuuuuuuu调用
,而
imshow
需要是一个替代构造函数,即
classmethod

我没有
xarray
,但这里有一个类似的补丁示例:

import itertools

class cchain(itertools.chain):

    def __init__(self, *args, **kwargs):
        print('Doing some things before chaining...')
        super().__init__(*args, **kwargs)

    @classmethod
    def from_iterable(cls, *args, **kwargs):
        print('Doing some things before chaining iterable...')
        return super().from_iterable(*args, **kwargs)

itertools.cchain = cchain
>itertools.cchain()
在链接之前做一些事情。。。
>>>itertools.cchain.from_iterable([])
在链接iterable之前做一些事情。。。

编辑:实际上,它似乎是一个函数,而不是一个类。我略读了一下代码,但它超出了我的理解范围,对不起。我不知道他们怎么会成为一种方法

编辑2:感谢您指出我第一次实际上是对的。我很困惑,因为这个库似乎是作为一个类使用的,这在我看来很时髦,但是如果它最终成为一个类,这个解决方案就行了


编辑3:在使用
xarray
进行测试后,我确认这实际上不起作用。这似乎是因为我之前提到的那些古怪的东西。如果有人能证明我错了,我洗耳恭听。

这与其说是一个xarray问题,不如说是一个python问题——我们可以用一个普通类替换
DataArray
,得到同样的问题。虽然没有完全回答,但希望您能够从-
pplot
开始工作,因为它正在创建一个方法
imshow
失败,因为在第一种情况下它是一个正常函数,
self
-a
pplotBase
实例在第二种情况下没有
plot
方法。@Maximilian,感谢您的评论。你是说这与xarray和matplotlib没有任何关系,所以我更改了标签(虽然我不知道如何制作更好的标题)@Maximilian也感谢pointin
>>> itertools.cchain()
Doing some things before chaining...
<__main__.cchain at 0x7f3793e88140>
>>> itertools.cchain.from_iterable([])
Doing some things before chaining iterable...
<__main__.cchain at 0x7f379341b700>