美文网首页
matplotlib.pyplot.figure()代码分析

matplotlib.pyplot.figure()代码分析

作者: 老周_o_o | 来源:发表于2018-04-20 16:53 被阅读0次
    import numpy as np
    import matplotlib.pyplot as plt
    fig = plt.figure()
    
    def figure(num=None,
               figsize=None,
               dpi=None,
               facecolor=None,
               edgecolor=None,
               frameon=True,
               FigureClass=Figure,
               clear=False,
               **kwargs
               ):
        """
    
        Returns【这段不明白】
        -------
        figure : Figure
            The Figure instance returned will also be passed to new_figure_manager
            in the backends【后端】, which allows to hook custom Figure classes into the
            pylab interface. Additional kwargs will be passed to the figure init
            function.
    
        Notes【大意是一次只能有一个活跃的figure】
        -----
        If you are creating many figures, make sure you explicitly【明确地】 call "close"
        on the figures you are not using, because this will enable pylab
        to properly clean up the memory.
    
        rcParams defines the default values, which can be modified in the
        matplotlibrc file【这个参数在源码中不知道怎么找,下面打印了默认值】
    
        """
        '''
        参数:
            num:编号。可以是字符串,整数,默认是none
            figsize:图片大小。整数的元组(以英尺为单位的宽高值,一英尺是2.54厘米),默认是none
            dpi:分辨率。整数,默认是none
            facecolor:背景颜色。默认是none
            edgecolor:边框颜色。默认是none
            frameon:边框。布尔值,默认是true,有边框
            FigureClass:继承matplotlib.figure.Figure的一个类。默认类名Figure
            clear:清空。布尔值,默认false,不清空
            **kwargs 
        '''
        if figsize is None:
            figsize = rcParams['figure.figsize']  # figsize如果是none则默认是[6.4, 4.8]
        if dpi is None:
            dpi = rcParams['figure.dpi']  # dpi == == == == = 100.0
        if facecolor is None:
            facecolor = rcParams['figure.facecolor']  # facecolor == == == == = w
        if edgecolor is None:
            edgecolor = rcParams['figure.edgecolor']  # edgecolor == == == == = w
    
    
        allnums = get_fignums()  # allnums == == == ==[]
        next_num = max(allnums) + 1 if allnums else 1  # next_num == == == ==1
        figLabel = ''
        if num is None:
            num = next_num
        elif isinstance(num, six.string_types):  # todo
            figLabel = num
            allLabels = get_figlabels() # todo
            if figLabel not in allLabels:
                if figLabel == 'all':
                    warnings.warn("close('all') closes all existing figures") # todo
                num = next_num
            else:
                inum = allLabels.index(figLabel) # todo
                num = allnums[inum] # todo
        else:
            num = int(num)
        '''
        如果num传none则是默认的递增整数
        如果num传数字那么就是这个数字
        如果num传字符串分三种情况:
            字符串在allLabels里已经存在,则num是列表里的序号
            字符串在allLabels不存在,num是递增的整数
            字符串是"all",则提出警告,且num是递增的整数
        这里num=1
        '''
    
        figManager = _pylab_helpers.Gcf.get_fig_manager(num)
        '''
        获取num对应的manager并使它活跃,并且返回相应manager,
        这里返回的none
        '''
    
    
        if figManager is None: # 如果返回的manager是none:
            max_open_warning = rcParams['figure.max_open_warning']  # max_open_warning=======20
            print(9999, max_open_warning)
    
            if (max_open_warning >= 1 and len(allnums) >= max_open_warning):  # 如果figure数大于允许的最大值20,目前figure数为0:
                warnings.warn(
                    "More than %d figures have been opened. Figures "
                    "created through the pyplot interface "
                    "(`matplotlib.pyplot.figure`) are retained until "
                    "explicitly closed and may consume too much memory. "
                    "(To control this warning, see the rcParam "
                    "`figure.max_open_warning`)." %
                    max_open_warning, RuntimeWarning)
                
            # get_backend().lower()====== module://backend_interagg
            if get_backend().lower() == 'ps':  
                dpi = 72
            
            # 创建一个figManager,暂时不讨论如何创建
            figManager = new_figure_manager(num, figsize=figsize,
                                            dpi=dpi,
                                            facecolor=facecolor,
                                            edgecolor=edgecolor,
                                            frameon=frameon,
                                            FigureClass=FigureClass,
                                            **kwargs)
    
            if figLabel:  # 为空
                figManager.set_window_title(figLabel)
                figManager.canvas.figure.set_label(figLabel)
    
            # make this figure current on button press event【不懂】
            def make_active(event):
                _pylab_helpers.Gcf.set_active(figManager)
    
            cid = figManager.canvas.mpl_connect('button_press_event', make_active)
            figManager._cidgcf = cid
    
            _pylab_helpers.Gcf.set_active(figManager)
            fig = figManager.canvas.figure
            fig.number = num
    
            # make sure backends (inline) that we don't ship that expect this
            # to be called in plotting commands to make the figure call show
            # still work.  There is probably a better way to do this in the
            # FigureManager base class.
            #【不懂】
            if matplotlib.is_interactive():
                draw_if_interactive()
    
            if _INSTALL_FIG_OBSERVER:
                fig.stale_callback = _auto_draw_if_interactive
    
        if clear: # 如果传的clear为true则清空
            figManager.canvas.figure.clear()
    
        return figManager.canvas.figure  # 返回Figure(640x480)像素640x480的一个画图屏幕
    

    相关文章

      网友评论

          本文标题:matplotlib.pyplot.figure()代码分析

          本文链接:https://www.haomeiwen.com/subject/ikrzkftx.html