问题描述
我试图抑制在下面的代码中运行的输出/绘图(因为我打算稍后调整绘图),但无论我尝试了什么,似乎都没有效果。
我已经根据引用的文章尝试了以下所有方法(乱扔我的代码,需要清理),但似乎没有任何效果。
相关 SO:
- Remove output of all subprocesses in Python without access to code
- Silence the stdout of a function in Python without trashing sys.stdout and restoring each function call
- Python: Suppress library output not using stdout
- IPython,semicolon to suppress output does not work
- https://github.com/ipython/ipython/issues/10794
- Suppress output in matplotlib
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))