2016-06-02 2 views
1

В настоящее время я выполняю тестовый проект, в котором я запускаю разные тесты и сохраняю их время выполнения в файлах. Затем я беру эти результаты и создаю график, который затем сравнивает тестовый прогон с его собственными более ранними результатами. Некоторые из кода довольно сложны, и я довольно долго озадачил меня, почему я иногда получаю больше сюжетов, чем должен. Я постараюсь предоставить всю необходимую информацию.Matplotlib иногда добавляет больше графиков к графику, чем он должен

Каждый тест имеет несколько наборов данных, и сохраняются в формате .txt, как это:

name: runtime 
Example: dataset #1: 8198 

Я нахожу все старые тесты с использованием glob.glob, и она работает просто отлично. Он находит более старые результаты только одного теста. Я знаю, что проблема заключается не в поиске результатов. Также результаты просто прекрасны, иногда есть неверный результат, но я отфильтровываю их просто отлично, поэтому используются только действительные результаты.

Я беру путь от результата, который я только что получил, и создаю график, найдя все более старые результаты. Я создаю пустой список (Called x) от 0 до n, который я использую для создания 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 повторно использует datapoints из графиков, созданных ранее, а не из фактического графика?

ответ

1

После того, как вы их сохранили, вы должны очистить участки plt.clf(), иначе вы будете писать на тот же рисунок.

См. this answer для получения дополнительной информации.

+0

Спасибо, что на самом деле решили! – cenh

Смежные вопросы