Matplotlib有时会向图表添加比它应该更多的图

时间:2016-06-02 11:24:30

标签: python matplotlib

我目前正在做一个基准测试项目,我在其中运行不同的测试并将其运行时存储在文件中。然后我获取这些输出并创建一个图形,然后将测试运行与其先前的结果进行比较。有些代码非常复杂,很长一段时间以来一直困扰着我,为什么我有时会得到比我应该更多的情节。我会尝试提供所有相关信息。

每个测试都有多个数据集,并存储在.txt中,如下所示:

name: runtime
Example: dataset #1: 8198

我使用glob.glob找到了所有旧的测试,它运行得很好。它只从相同的测试中找到较旧的结果。我知道问题不在于找到结果。结果也很好,有时结果无效,但我把它们过滤得很好,所以只使用了有效的结果。

我从我刚刚得到的结果中取出路径,并通过查找所有较旧的结果来创建图表。我创建了一个从0到n的空列表(调用x),我用它来制作xticks,因为我想在x轴上自定义刻度(提交名称)。

# Get all older and current results from a given test
outputs = getValidResults(path)
# Stores the runs in a list like:
# [[dataset1 run1, dataset1 run2],[datset2 run1, dataset2 run2]]
runs = getAllRuns(outputs)
# Names used for xticks
commits = getAllCommits(path)
# Name of the test
testName = getTestName(path)

x = []
for m in range(0, len(outputs)):
    x.append(m)

for n in range(0, dataset_amount):
    y = []
    for run in runs:
        y.append(run[n])
    plt.xticks(x, commits, rotation=70)
    logger.debug('x is: {} and y is: {}'.format(x,y))
    plt.plot(x, y, 'o-')
plt.ylabel('Build/run time in microseconds')
plt.xlabel('Commit')
lgd = plt.legend(datasets, bbox_to_anchor=(1, 0.5), loc='center left', fancybox=True)
plt.title(testName)
plt.grid(True)
plt.tight_layout()
plt.savefig(savePath, bbox_extra_artists=(lgd,), bbox_inches='tight')

现在您将注意到,无论何时绘制x和y值,我都会记录。当我查看我的日志时,我得到了,它只尝试添加一个情节,即使这样两个都是空的:

[2016-06-02 11:29:16,684] - {DEBUG:htmlgen.py:197} - x is: [] and y is: []

然而,它仍然会保存图表,而出现的图表是:

Graph with wrong plot

结果都是错误的,首先您可以在图例中看到此测试只有一个数据集。它不可能有多个。另一个有趣的事情是,图表上的结果来自另一个在此之前创建的测试。这让我相信它会以某种方式重复使用相同的结果,这可能是一个内存问题吗?

我试图记录每个变量,并且它们都是空的,期望数据集是正确的:

[2016-06-02 11:29:16,650] - {DEBUG:htmlgen.py:167} - Average is: []
[2016-06-02 11:29:16,650] - {DEBUG:htmlgen.py:168} - Commits found: [].
[2016-06-02 11:29:16,650] - {DEBUG:htmlgen.py:169} - Datasets found: ['fluid-n_steps=1-n_solver_steps=40-grid_res=100.input:'].
[2016-06-02 11:29:16,650] - {DEBUG:htmlgen.py:170} - Dataset length: 1
[2016-06-02 11:29:16,650] - {DEBUG:htmlgen.py:171} - Outputs found: []
[2016-06-02 11:29:16,683] - {DEBUG:htmlgen.py:180} - Trying to create plot points...
[2016-06-02 11:29:16,684] - {DEBUG:htmlgen.py:197} - x is: [] and y is: []
[2016-06-02 11:29:16,686] - {DEBUG:htmlgen.py:199} - Successfully created plot points.

它根本找不到任何结果,但不知何故仍然会生成图形,即使它实际上没有在代码中绘制任何内容。

有趣的是,我制作的第一张图总是很好。但是,从第二个图表和图表中重新使用首先创建的图表的结果。

有没有人经历或看过这样的事情? matplotlib重新使用前面创建的图形中的数据点,而不是实际的图形中的数据点?

1 个答案:

答案 0 :(得分:1)

您应该在保存后用plt.clf()清除这些图,否则您将写入相同的数字。

有关详细信息,请参阅this answer