我目前正在做一个基准测试项目,在其中运行不同的测试并将其运行时存储在文件中。然后,我获取这些输出并创建一个图表,然后将测试运行与其之前的结果进行比较。有些代码相当复杂,这让我困惑了很长一段时间,为什么我有时会得到比我应该得到的更多的图。我会尽力提供所有相关信息。
每个测试都有多个数据集,并存储在 .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: []
但是它仍然保存图表,并且出来的图表是:
结果都是错误的,首先,正如您在图例中看到的那样,该测试只有一个数据集。它不可能有超过一个。另一件值得注意的有趣的事情是,图表上的结果来自在此测试之前创建的另一个测试。这让我相信它以某种方式重用了相同的结果,这可能是内存问题吗?
我尝试记录每个变量,但它们都是空的,期望数据集是正确的:
[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 在哪里重用之前创建的图表中的数据点,而不是实际制作的图表中的数据点?
最佳答案
保存绘图后,您应该使用 plt.clf()
清除绘图,否则您将写入相同的图形。
参见this answer了解更多信息。
关于python - Matplotlib 有时会向图表添加比应有的更多绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37590475/