У меня есть сценарий, который должен зацикливаться на серии файлов csv для создания разных ориентированных графов. При сохранении с помощью matplotlib (plt.savefig()) графики, похоже, сохраняются друг над другом, когда цикл продолжается. Если я использую plt.show(), который требует, чтобы я вручную закрывал файл для каждого цикла, этого не происходит. То же самое, если я делаю через отладчик. Может ли кто-нибудь дать мне какие-либо советы о том, что может произойти?
"""Script to read in CSV file with relations (after having processed with weighting),
and then make a tree hierarchy of relations
"""
import pandas as pd
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
import os
#create graph
def panda_tree():
path = './CONLL_test/weighted/weighted_out/'
filelist = os.listdir(path)
i = 1
# read in files as dataframe and change to lists
for file in filelist:
if file.endswith('csv'):
parent_child_rel = pd.read_csv(path+file)
parents = parent_child_rel['parent']
children = parent_child_rel['child']
# change lists to tuples
relations = pd.DataFrame({'from': parents, 'to': children})
print(relations)
# Build your graph
graph_name = 'G%s' %i
graph_name=nx.from_pandas_edgelist(relations, 'from', 'to', create_using=nx.DiGraph())
# Plot it
nx.draw(graph_name, with_labels=True)
filename = os.path.splitext(file)
(f, ext) = filename
plt.savefig(path+'directed/'+f+'_dirgraph.png')
i+=1
def main():
panda_tree()
if __name__ == '__main__':
main ()
Файлы - это данные, содержащие все меньше данных, поскольку я включаю данные только в том случае, если он имеет более 10, 20 и т.д., Достигает 100. Граф 100 самый загруженный, и когда я запускаю его самостоятельно, у меня нет этого проблема. У кого-нибудь еще была эта проблема, или кто-нибудь может дать мне подсказку о том, как ее преодолеть? Данные являются родительскими дочерними отношениями (парами).
Проблема в том, что вы не очищали fig
который является глобальным объектом, созданным pyplot
. Это означает, что каждый раз вокруг вашего цикла добавляется больше данных ("графики, кажется, сохраняются друг над другом").
Чтобы этого избежать, вы можете вызвать plt.clf()
или plt.close()
после вашего вызова plt.save_fig()
.
Если вы создаете много цифр, вы определенно должны предпочесть plt.close()
, поскольку plt.clf()
не освобождает память, используемую для каждой фигуры.
plt.clf()
послеplt.savefig()