在使用pytest进行测试时隐藏matplotlib绘图

4

我正在编写一个简单的库,给定数据集,它会运行一堆分析并在中途显示很多图表。(有许多plt.show()调用)

我编写了简单的测试用例,使用pytest检查不同函数是否无误。

问题是,一旦我运行pytest,它就开始显示所有这些图表,我必须一个一个关闭,这需要很长时间。

如何静默所有图表并仅查看所有测试是通过还是未通过?


3
我也很好奇是否有一种“干净”的方法来实现这一点。一个解决方案是修改你的代码(如果可以的话),在你的模块顶部添加 _show=True 变量,然后将 plt.show() 替换为 if _show: plt.show()。此外,在这个模块中定义这个函数:def unset_show(): global _show; _show=False。然后,在你的测试中,导入并执行 unset_show(),这样图形就不会显示出来了。这就是 SymPy 所做的事情。 - Davide_sd
1个回答

1
如果您的后端支持使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接