Сохранение нескольких фигур из каждого файла для нескольких файлов отдельно - PullRequest
1 голос
/ 07 ноября 2019

У меня есть код, который может читать и запускать несколько файлов и генерировать несколько фигур из каждого файла. Я хочу сохранить все цифры отдельно. Но я могу сохранить только одну фигуру из каждого файла. Например, у меня есть 17 файлов, каждый файл генерирует 3 цифры, поэтому у меня должно быть всего 51 цифра. Код отображает все 51 цифру (по 3 из каждого файла), но сохраняет только одну цифру из каждого файла, всего 17 цифр. Как я могу сохранить все цифры отдельно?

import os
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

for file in os.listdir(r'/mydir'):
    if file.endswith(".txt"):
        print(os.path.join("/mydir", file))
        life_time= pd.read_csv(file, sep = "\t")
        life_time.columns = ["Time" , "Counts"]
        time= life_time.Time[2:599]
        time_1=time-1e-06
        x1=time_1.reset_index(drop=True)
        bin1 = life_time.Counts[2:599]
        bin2 = life_time.Counts[602:1199]
        bin3 = life_time.Counts[1202:1799]
        """Reser the index"""
        r_bin1=bin1.reset_index(drop=True)
        r_bin2=bin2.reset_index(drop=True)
        r_bin3=bin3.reset_index(drop=True)


        x= x1[1:598]
        y1=r_bin1[1:598]
        y2=r_bin2[1:598]
        y3=r_bin3[1:598]
#From each dataset I have created three y value such as y1, y2, y3 and then created a list
        y = [y1, y2, y3]
        def exponenial_func(x, a, b, c):
            return a*np.exp(-b*x)+c
        for i in y:
            popt, pcov = curve_fit(exponenial_func, x, i)
            a, b, c = popt
            yy = exponenial_func(x, *popt)
            plt.plot(x,i)
            plt.plot(x, yy, 'r--')
            plt.savefig("file{}.jpg".format(file), dpi = 600, bbox_inches = "tight")
            plt.show()

Например, мои имена файлов: USA_1, USA_2 ...... и т. Д. Я хочу сохранить рисунок с именем рисунка USA_1_bin1, USA_1_bin2, USA_1_bin3, USA_2_bin1, USA_2_bin2, USA_2_bin3 ....

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Кажется, вы перезаписываете свой сюжет три раза. Попробуйте вместо этого:

savename = f'{file}'+'_bin'+str(y.index(i)+1)+'.jpg'    
plt.savefig(savename, dpi = 600, bbox_inches = "tight")

Как предложил kingfischer, мне тоже нравится это более явно, но в этом случае это не требуется.

edit: Учитывая, что y на самом деле являетсяСписок серий ниже является более подходящим решением:

for count, i in enumerate(y):
    #other code
    savename = f'{file}'+'_bin'+str(count+1)+'.jpg'    
    plt.savefig(savename, dpi = 600, bbox_inches = "tight")
0 голосов
/ 07 ноября 2019

Я думаю, что вы пропустили ту часть кода, которая выполняет фактическое построение. Не могли бы вы добавить это или что-то представительное? Не видя этого, я предполагаю, что вы генерируете 3 цифры в каждом цикле, но, вызывая plt.savefig(), вы ссылаетесь только на последнюю сгенерированную цифру. Например, если вы сделаете это:

for file in os.listdir(r'/mydir'):
    data = # something that reads your .txt file into an array or dataframe
    plt.figure()
    plt.plot(data[0], data[1])  # first graph
    plt.figure()
    plt.scatter(data[0], data[2])  # second graph
    plt.figure()
    plt.hist(data[3])  # third graph
    plt.savefig(f"file{file}.jpg")  # f-strings are super cool!

Вы создадите 3 отдельные фигуры, но сохраните только последнюю, потому что вы на самом деле не указали, какую фигуру вы хотите сохранить. Переводчик предполагает, что вы заинтересованы в последней цифре. Быстрый способ обойти это - передать ваши цифры переменным, например так:

for file in os.listdir(r'/mydir'):
    data = # something that reads your .txt file into an array or dataframe

    fig1 = plt.figure()
    plt.plot(data[0], data[1])  # first graph
    fig2 = plt.figure()
    plt.scatter(data[0], data[2])  # second graph
    fig3 = plt.figure()
    plt.hist(data[3])  # third graph

    # now we can refer to the figures by variable name as save them
    fig1.savefig(f"file{file}_1.jpg")
    fig2.savefig(f"file{file}_2.jpg")
    fig3.savefig(f"file{file}_3.jpg")

Теперь будут созданы те же 3 фигуры, но каждая из них будет сохранена отдельно. Однако я не фанат этого метода, потому что простой вызов plt.plot() предполагает, что вы имеете в виду последнюю активную цифру. Что-то более явное не оставит места для ошибок, поэтому я очень предпочитаю следующее:

for file in os.listdir(r'/mydir'):
    data = # something that reads your .txt file into an array or dataframe
    # First create your figures and axes
    fig1, ax1 = plt.subplots()
    fig2, ax2 = plt.subplots()
    fig3, ax3 = plt.subplots()

    # Then plot your data on the specific axes
    ax1.plot(data[0], data[1])  # first graph
    ax2.scatter(data[0], data[2])  # second graph
    ax3.hist(data[3])  # third graph

    # now we can refer to the figures by variable name as save them
    fig1.savefig(f"file{file}_1.jpg")
    fig2.savefig(f"file{file}_2.jpg")
    fig3.savefig(f"file{file}_3.jpg")

Вы также можете ссылаться на объекты ax1, ax2, ax3 matplotlib.axes, чтобы изменить форматирование так, как вам хочется, и ничего не получитсяперепутать или положиться на порядок вы пишете в своем коде.

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