在递归函数中返回matplotlib图形对象时,为什么还要绘制一个额外的空白图形?

时间:2018-11-06 03:11:25

标签: python matplotlib plotly

说我有以下简单函数可返回matplotlib图形对象:

import matplotlib.pyplot as plt
def return_mpl_fig(x,y):
    mpl_fig = plt.figure()
    ax = mpl_fig.add_subplot(111)
    ax.plot(x,y)
    return mpl_fig

我可以将matplotlib图形对象转换为可绘制图形对象并对其进行绘制:

from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
import plotly.tools as tls

x=[i for i in range(1,11)]
y=[i for i in range(1,11)]

mpl_fig = return_mpl_fig(x,y)
plotly_fig = tls.mpl_to_plotly(mpl_fig)

init_notebook_mode(connected=True)
iplot(plotly_fig)

enter image description here

但是,如果我不是简单函数而是递归函数,它还会绘制一个空白图形:

import matplotlib.pyplot as plt
def return_mpl_fig(x,y):
    mpl_fig = plt.figure()
    ax = mpl_fig.add_subplot(111)
    if len(x)>5:
        return return_mpl_fig(x[:5],y[:5])
    ax.plot(x,y)
    return mpl_fig

from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
import plotly.tools as tls

x=[i for i in range(1,11)]
y=[i for i in range(1,11)]

mpl_fig = return_mpl_fig(x,y)
plotly_fig = tls.mpl_to_plotly(mpl_fig)

init_notebook_mode(connected=True)
iplot(plotly_fig)

enter image description here

那是为什么?以及如何预防呢?

1 个答案:

答案 0 :(得分:0)

由于您已经修改了用于创建图形引用的库,因此请注意如何创建该引用,以免在您的图形中创建不必要的图形功能。我相信一个相当简单的更改是使用gcf()gca()编写函数,如果存在则返回当前图形或轴的实例,否则创建新的实例:

def return_mpl_fig(x,y):
    mpl_fig = plt.gcf()
    ax = mpl_fig.gca()
    if len(x)>5:
        return return_mpl_fig(x[:5],y[:5])
    ax.plot(x,y)
    return mpl_fig