【问题标题】:How to suppress output of a series of plots如何抑制一系列图的输出
【发布时间】:2021-06-14 01:58:05
【问题描述】:

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

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

  • 添加分号
  • 通过;声明
  • 调整笔记本的环境条件
  • 使用子流程函数和修改后的抑制函数

相关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'], sort = False, 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]);
  


有什么想法吗?

【问题讨论】:

  • 命名空间“sns”从何而来?
  • @labroid - 它来自 seaborn - 我在代码中添加了这些额外的导入语句。

标签: python plot jupyter-notebook hide suppress


【解决方案1】:

您似乎要求在 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'], sort = False, ax=ax2, alpha=0.15)
print(type(fig))

【讨论】:

  • 我从代码中完全删除了'%matplotlib inline',完全关闭并重新启动,但不幸的是我仍然得到图形输出。你在输出被抑制的地方运行了什么代码?
  • 嗨 - 我在我的文件和使用您的代码的全新笔记本中都尝试了您的代码,但在这两种情况下,图表都显示在 ''。我想要做的是显示图表...(ps 感谢您的尝试)
  • 嗯,当我执行上述操作时,它们没有显示出来,所以你的环境一定有什么不同。对不起,它没有帮助!不幸的是,我不知道在 stackoverflow 中显示图形的方法。您是否在 Colab 等托管环境中尝试过此操作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-17
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 2016-03-07
相关资源
最近更新 更多