繁体   English   中英

如何存储一个function的output

[英]How to store the output of a function

我有一个 dataframe 如下: x = [1,2,3.....10000] y = [1,2,3.....10000]

我在 matplotlib 中使用 SpanSelector 工具对 x 数据进行选择。 根据选择,我得到两个值 (xmin, xmax)

现在我想要 plot 另一个 plot(与我已经绘制的不同),x 轴设置为 (xmin, xmax)

`

ax.errorbar(x=x,y=y,yerr=y_err)

def onselect(xmin, xmax):

    print('\nLower value: ',xmin)
    print('Upper value: ',xmax)
    return xmin,xmax

span = SpanSelector(
    ax,
    onselect,
    "horizontal",
    useblit=True,
    props=dict(alpha=0.5, facecolor="tab:green"),
    interactive=True,
    drag_from_anywhere=True
)

`

我尝试在函数内部使用 plt 命令,它打印给定的打印语句,但不打印。

我基本上想要这个: https://matplotlib.org/stable/gallery/widgets/span_selector.html用于我自己的用例,我无法做到。 执行相同操作的任何其他方法也足够了。

问题是您传递给 SpanSelector 的SpanSelector是作为回调实现的,其中不使用返回值。 因此,您必须为这个 function 找到一种方法,将值永久存储在某个地方(超出函数的生命周期/ scope)而不返回它。 实际上有两种方法:要么,您使用全局变量并让 function 写入它们。 这看起来像这样:

xmin_global = None
xmax_global = None

def onselect(xmin, xmax):
    global xmin_global 
    global xmax_global 
    xmin_global = xmin
    xmax_global = xmax

然而,通常不鼓励使用全局变量,因为很难跟踪行为,而且代码库越大,理解代码的作用和调试它就变得非常复杂。 然而,对于小型独立代码片段,通常可以使用它。

另一种(在我看来更好)的方法是将onselect定义为 object 的一种方法,它将变量xminxmax作为成员属性。 然后该方法可以将 object 的这些属性设置为您的值,然后您可以从 object 检索它们。这可能看起来像这样:

class Selector:
    
    def __init__(self, ax):
        self.ax = ax
        self.xmin = None
        self.xmax = None
        
        self.span = SpanSelector(
            self.ax,
            self.onselect,
            "horizontal",
            useblit=True,
            props=dict(alpha=0.5, facecolor="tab:blue"),
            interactive=True,
            drag_from_anywhere=True
        )
        
    def onselect(self, xmin, xmax):
        self.xmin = xmin
        self.xmax = xmax
        
selector = Selector(ax1)

在这里,我也在__init__方法中的 class 内部初始化了SpanSelector 但这也可以在 class 之外完成。要点是onselect作为一种方法可以访问 object 的所有属性,并且可以通过self引用写入它们。 可以将它们视为 class 的 scope 中的全局变量。稍后您可以使用selector.xminselector.xmax访问它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM