微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何抑制一系列图的输出

如何解决如何抑制一系列图的输出

我试图抑制在下面的代码中运行的输出/绘图(因为我打算稍后调整绘图),但无论我尝试了什么,似乎都没有效果

我已经根据引用的文章尝试了以下所有方法(乱扔我的代码,需要清理),但似乎没有任何效果

相关 SO:

    dictionary_of_figures = OrderedDict()
    dictionary_of_images = OrderedDict()
        
    from contextlib import contextmanager
    import sys,os
    import subprocess
    import inspect
    import contextlib
    import io
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    import numpy as np
    import matplotlib.ticker as ticker
    from collections import OrderedDict
      
    def draw_year_close_plot(df,group_by_column_name,year):
        reduced_range = df.loc[(df['Year'] == year)]
        year_string = str(year)
        
        # 0 - Setup
        matplotlib.rc_file_defaults();
        ax1 = sns.set_style("darkgrid"); #"style must be one of white,dark,whitegrid,darkgrid,ticks"
        fig,ax1 = plt.subplots(figsize=(5,2));
        # 1 - Create Closing Plot
        lineplot = sns.lineplot(data = reduced_range['Close'],sort = False,ax=ax1);
        pass;
        ax1.xaxis.set_major_formatter(ticker.EngFormatter())
        lineplot.set_title(company_name + str(" (")+ stock_ticker + str(") - ") + 'Historical Close & Volume - ' + year_string,fontdict= { 'fontsize': 8,'fontweight':'bold'})
        # 2 - Create Secondary Plot - Volume
        ax2 = ax1.twinx();
        ax2.grid(False);
        sns.lineplot(data = reduced_range['Volume'],ax=ax2,alpha=0.15);
        pass;
    
        return fig
    
    from IPython.core.interactiveshell import InteractiveShell
    InteractiveShell.ast_node_interactivity = "last_expr"
    
    #@contextmanager
    #def suppress_stdout():
    #    with open(os.devnull,"w") as devnull:
    #        old_stdout = sys.stdout
    #        sys.stdout = devnull
    #        try:  
    #            yield
    #        finally:
    #            sys.stdout = old_stdout
    
    
    #@contextlib.contextmanager
    #def nostdout():
    #    save_stdout = sys.stdout
    #    sys.stdout = io.BytesIO()
    #    yield
    #    sys.stdout = save_stdout
        
    with contextlib.redirect_stdout(io.StringIO()):
        for year in range(min_year,min_year+5):    
            dictionary_of_figures[year] = draw_year_close_plot(daily_df,'Year',year);
            dictionary_of_images[year] = fig2img(dictionary_of_figures[year]);
  


有什么想法吗?

解决方法

您似乎要求在 Jupyter 环境中抑制绘图。 %matplotlib inline 使绘图在输出上呈现。如果删除该行,则不会渲染绘图,并且会取回绘图对象(我在您的代码上对此进行了测试)。

一旦 Jupyter 中的内核运行了 %matplotlib inline,您就无法将其注释掉 - 它会一直存在于内核中。您需要将其注释掉并重新启动内核,此时我想您会看到您想要的行为。

按照您的方式修改绘图后,您可以重新打开 %matplotlib inline 并渲染更新后的绘图。

如果您需要打开和关闭 %matplotlib inline,您需要对您的 Jupyter 环境有所了解。请参阅this answer

更新:

我尝试了几个案例。如果您明确地将 %matplotlib 设置为除 inline 之外的选项,它看起来最好。这是用于说明的最少代码。我保留了您所有与图形相关的代码,并在您的问题未提供值的地方编写了数据,并打印了 fig 的类型(这是您的返回值)。我还明确设置了 %matplotlib notebook。请注意,您应该运行 %matplotlib --list 以确保这是您的选择之一。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.ticker as ticker

df = pd.DataFrame({'Close': [1,2,3],'Volume': [4,5,6]})

%matplotlib notebook 
# matplotlib.rc_file_defaults() # We don't have your defaults file
ax1 = sns.set_style("darkgrid"); #"style must be one of white,dark,whitegrid,darkgrid,ticks"
fig,ax1 = plt.subplots(figsize=(5,2))
lineplot = sns.lineplot(data=df['Close'],sort = False,ax=ax1)
ax1.xaxis.set_major_formatter(ticker.EngFormatter())
lineplot.set_title("This is the Title")
ax2 = ax1.twinx()
ax2.grid(False)
sns.lineplot(data=df['Volume'],ax=ax2,alpha=0.15)
print(type(fig))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。