python - Matplotlib 有时会向图表添加比应有的更多绘图

标签 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 在哪里重用之前创建的图表中的数据点,而不是实际制作的图表中的数据点?

最佳答案

保存绘图后,您应该使用 plt.clf() 清除绘图,否则您将写入相同的图形。

参见this answer了解更多信息。

关于python - Matplotlib 有时会向图表添加比应有的更多绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37590475/

相关文章:

python - 大型 Python 包括

python - 使用 numpy 数组计算累积最小值

python - 扭曲列表列表

python - 在 PyCharm 中禁用检查

python - plt.quiver() 在某些地方绘制点而不是向量

python - Matplotlib 简单案例内存泄漏与 Pandas

python - 通过热图填充多边形

Matplotlib:堆叠条形图

python - 在 Python 的 matplotlib 中绘制球体表面的点

python - 使用 Python 迭代文本文件并将一组行存储在单独的数组中