Matplotlib plus NetworkX, создающий наложенные графики при цикле по нескольким файлам

1

У меня есть сценарий, который должен зацикливаться на серии файлов 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 самый загруженный, и когда я запускаю его самостоятельно, у меня нет этого проблема. У кого-нибудь еще была эта проблема, или кто-нибудь может дать мне подсказку о том, как ее преодолеть? Данные являются родительскими дочерними отношениями (парами).

  • 0
    Можете ли вы добавить пример данных, которых достаточно, чтобы воспроизвести проблему, с которой вы столкнулись?
  • 1
    Попробуйте добавить plt.clf() после plt.savefig()
Показать ещё 1 комментарий
Теги:
pandas
matplotlib
networkx

1 ответ

1
Лучший ответ

Проблема в том, что вы не очищали fig который является глобальным объектом, созданным pyplot. Это означает, что каждый раз вокруг вашего цикла добавляется больше данных ("графики, кажется, сохраняются друг над другом").

Чтобы этого избежать, вы можете вызвать plt.clf() или plt.close() после вашего вызова plt.save_fig().

Если вы создаете много цифр, вы определенно должны предпочесть plt.close(), поскольку plt.clf() не освобождает память, используемую для каждой фигуры.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню