Matplotlib有时会向图形中添加比它应该添加的更多的绘图

2024-04-26 13:35:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在做一个基准测试项目,在这个项目中我运行不同的测试,并将它们的运行时存储在文件中。然后我获取这些输出并创建一个图,然后将测试运行与它自己的早期结果进行比较。有些代码相当复杂,这让我困惑了很长一段时间,为什么我有时会得到比我应该得到的更多的情节。我会尽力提供所有相关信息。你知道吗

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

name: runtime
Example: dataset #1: 8198

我发现所有以前的测试都使用全球。全球,而且效果还不错。它只从相同的测试中找到旧的结果。我知道问题不在于找到结果。而且结果很好,有时有一个无效的结果,但我过滤掉他们只是罚款,所以只有有效的结果被使用。你知道吗

我从刚刚得到的结果中提取路径,并通过查找所有较旧的结果来创建一个图。我创建了一个从0到n的空列表(称为x),用于生成xtick,因为我需要在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在哪里重用先前创建的图中的数据点,而不重用正在生成的实际图中的数据点?你知道吗


Tags: and数据pathruninpydebugfor