我正在编写一个简单的库,给定数据集,它会运行一堆分析并在中途显示很多图表。(有许多plt.show()调用
)
我编写了简单的测试用例,使用pytest检查不同函数是否无误。
问题是,一旦我运行pytest,它就开始显示所有这些图表,我必须一个一个关闭,这需要很长时间。
如何静默所有图表并仅查看所有测试是通过还是未通过?
我正在编写一个简单的库,给定数据集,它会运行一堆分析并在中途显示很多图表。(有许多plt.show()调用
)
我编写了简单的测试用例,使用pytest检查不同函数是否无误。
问题是,一旦我运行pytest,它就开始显示所有这些图表,我必须一个一个关闭,这需要很长时间。
如何静默所有图表并仅查看所有测试是通过还是未通过?
plt.ion()
进行交互式显示,那么您只需要对代码进行最小的更改(四行)即可:import matplotlib.pyplot as plt
#define a keyword whether the interactive mode should be turned on
show_kw=True #<--- added
#show_kw=False
if show_kw: #<--- added
plt.ion() #<--- added
#your usual script
plt.plot([1, 2, 3], [4, 5, 6])
plt.show()
plt.plot([1, 3, 7], [4, 6, -1])
plt.show()
plt.plot([1, 3, 7], [4, 6, -1])
plt.show()
#closes all figure windows if show_kw is True
#has no effect if no figure window is open
plt.close("all") #<--- added
print("finished")
然而,如果绘图生成需要很长时间,那么这种方法就不可行了,因为它只是防止你一个一个地关闭它们 - 它们仍然会被生成。在这种情况下,您可以将后端切换到无GUI版本,该版本无法显示图形:
import matplotlib.pyplot as plt
from matplotlib import get_backend
import warnings
show_kw=True
#show_kw=False
if show_kw:
curr_backend = get_backend()
#switch to non-Gui, preventing plots being displayed
plt.switch_backend("Agg")
#suppress UserWarning that agg cannot show plots
warnings.filterwarnings("ignore", "Matplotlib is currently using agg")
plt.plot([1, 2, 3], [4, 5, 6])
plt.show()
plt.plot([1, 3, 7], [4, 6, -1])
plt.show()
plt.plot([1, 3, 7], [4, 6, -1])
plt.show()
#display selectively some plots
if show_kw:
#restore backend
plt.switch_backend(curr_backend)
plt.plot([1, 2, 3], [-2, 5, -1])
plt.show()
print("finished")
plt.switch_backend()
已经被 matplotlib.use()
替代了(或者至少我在当前文档中找不到 plt.switch_backend()
的信息(2020年10月)。 - Barzi2001
_show=True
变量,然后将plt.show()
替换为if _show: plt.show()
。此外,在这个模块中定义这个函数:def unset_show(): global _show; _show=False
。然后,在你的测试中,导入并执行unset_show()
,这样图形就不会显示出来了。这就是 SymPy 所做的事情。 - Davide_sd