【问题标题】:How to pass/return matplotlib objects to/from functions in python如何将matplotlib对象传递/返回python中的函数
【发布时间】:2018-06-06 01:21:27
【问题描述】:

我正在尝试创建一个模块,其中包含用于创建绘图的简单函数,其中一些常用格式已应用于它们。其中一些函数将应用于已经存在的 matplotlib 对象,并将其他 matplotlib 对象返回到主程序。

第一段代码是我当前如何生成绘图的示例,它按原样工作。

# Include relevant python libraries
from matplotlib import pyplot as plt

# Define plot formatting
axesSize = [0, 0, 1, 1]
axesStyle = ({'facecolor':(0.95, 0.95, 0.95)})

gridStyle = ({'color':'k',
              'linestyle':':',
              'linewidth':1})

xString = "Independent Variable"
xLabelStyle = ({'fontsize':18,
                'color':'r'})

# Create figure and axes objects with appropriate style
figureHandle = plt.figure()
axesHandle = figureHandle.add_axes(axesSize, **axesStyle)

axesHandle.grid(**gridStyle)
axesHandle.set_xlabel(xString, **xLabelStyle)

我想创建一个函数,将 add_axes() 命令与 grid() 和 set_xlabel() 命令结合起来。作为第一次尝试,忽略所有样式,我在我的 NTPlotTools.py 模块中提出了以下函数。

def CreateAxes(figureHandle, **kwargs):
    axesHandle = figureHandle.add_axes()
    return axesHandle

调用函数的脚本如下:

# Include relevant python libraries
from matplotlib import pyplot as plt
from importlib.machinery import SourceFileLoader as fileLoad

# Include module with my functions
pathName = "/absolute/file/path/NTPlotTools.py"
moduleName = "NTPlotTools.py"
pt = fileLoad(moduleName, pathName).load_module()

# Define plot formatting
gridStyle = ({'color':'k',
              'linestyle':':',
              'linewidth':1})

# Create figure and axes objects with appropriate style
figureHandle = plt.figure()
axesHandle = pt.CreateAxes(figureHandle)

axesHandle.grid(**gridStyle)

但是,我在运行主代码时收到以下错误消息:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-73802a54b21a> in <module>()
     17 axesHandle = pt.CreateAxes(figureHandle)
     18 
---> 19 axesHandle.grid(**gridStyle)

AttributeError: 'NoneType' object has no attribute 'grid'

这告诉我 axesHandle 不是 matplotlib 坐标轴对象,并且通过扩展, CreateAxes() 函数调用没有返回 matplotlib 坐标轴对象。将 matplotlib 对象传递给函数或从函数传递有技巧吗?

【问题讨论】:

    标签: python function oop matplotlib


    【解决方案1】:

    你快到了。问题出在这一行。

    def CreateAxes(figureHandle, **kwargs)
        axesHandle = figureHandle.add_axes() # Here
        return axesHandle
    

    source code 开始,add_axes 方法将如下所示

    def add_axes(self, *args, **kwargs):
        if not len(args):
           return
        # rest of the code ...
    

    因此,当您在不带任何参数的情况下调用 figureHandle.add_axes() 时,argskwrags 都将为空。从源代码中如果args 为空add_axes 方法返回None。因此,这个None 值被分配给axesHandle,当你尝试调用axesHandle.grid(**gridStyle) 时,你会得到

    AttributeError: 'NoneType' object has no attribute 'grid'
    

    示例

    >>> def my_demo_fun(*args, **kwrags):
    ...     if not len(args):
    ...          return
    ...     return args
    ...
    >>> print(my_demo_fun())
    None
    >>> print(my_demo_fun(1, 2))
    (1, 2)
    

    所以通过将参数传递给add_axes 方法来重写函数。

    def create_axes(figure_handle, **kwargs):
        axes_handle = figure_handle.add_axes(axes_size, **axes_style) 
        return axes_handle
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      相关资源
      最近更新 更多