Matplotlib plus NetworkX, создающий наложенные графики при цикле по нескольким файлам - PullRequest
0 голосов
/ 11 октября 2018

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

1 Ответ

0 голосов
/ 15 октября 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...