Как передавать / возвращать объекты matplotlib в / из функций в Python - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь создать модуль, который содержит простые функции для создания графиков с некоторым распространенным форматированием, уже примененным к ним.Некоторые из этих функций будут применяться к уже существующим объектам 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 в / из функций?

1 Ответ

0 голосов
/ 06 июня 2018

Вы почти у цели.Проблема с этой строкой.

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() без параметров и args, и kwrags будут пустыми.Из исходного кода, если 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...