У меня есть функция 'plot_rdm', которая создает график и сохраняет его как 'rdm.png'. Я хочу, чтобы было создано несколько таких графиков, каждый из которых использовал бы свой .json-файл - поэтому я сохранил функцию plot_rdm в 'plotrdm.py'.

В файле saverdm.py я определил путь к файлу .json, из которого я хочу создать график, а затем вызвал функцию plot_rdm, перебирая все файлы, из которых я хочу создать график:

#import libraries
import numpy as np
import matplotlib
import matplotlib.pyplot
import matplotlib.pyplot as plt
import scipy
import scipy.spatial
import scipy.spatial.distance as sd
from scipy.spatial.distance import squareform
import os
import json 

# define fpath 
#i.e. fpath[0] will be the first filepath... 

path = './RDM_researchproject' 
rootdir = path
filepath = []
for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        if file.startswith('Meadows'):
            count=0 # count default
            filepath.append(os.path.join(subdir, file))
            fpath = filepath[count]
            os.system("/home/taran/RDM_researchproject/AVIMA/plotrdm.py")
            count +=1      

Файл plotrdm.py с функцией plot_rdm выглядит следующим образом:

def plot_rdm(fpath):
    import numpy as np
    import matplotlib
    import matplotlib.pyplot
    import matplotlib.pyplot as plt
    import scipy
    import scipy.spatial
    import scipy.spatial.distance as sd
    from scipy.spatial.distance import squareform
    import json 
    
    with open(fpath) as fhandle:
        data = json.load(fhandle)
     #inspect rdm stimuli labels 
    stim = data['stimuli']

    #contain all labels for y axis and x axis seperately  
    y_names = []
    for i in stim:
        y_names.append(i['name'])

    x_names = []
    for i in stim:
        x_names.append(i['name'])

    #create rdm array and squareform 
    rdm_array = np.array(data['rdm'])
    srdm = squareform(rdm_array)

    #label x and y axis on rdm 
    fig, ax = plt.subplots()
    rdm = ax.imshow(srdm)

    ax.set_xticks(np.arange(len(x_names)))
    ax.set_yticks(np.arange(len(y_names)))

    ax.set_xticklabels(x_names)
    ax.set_yticklabels(y_names)
    plt.setp(ax.get_xticklabels(), rotation=90, ha="right", rotation_mode="anchor")
    plt.plot(srdm)
    plt.imshow(srdm)
    plt.colorbar(mappable = None, cax = None, ax = None)
    fig.subplots_adjust(bottom=0.23)
import matplotlib.pyplot as plt
plt.savefig('rdm.png')

У меня получается создавать графики по отдельности (т.е. когда я не вызываю функцию plot_rdm и не перебираю файлы, а каждый раз указываю путь к файлу). Но когда я использую следующий код, я получаю пустое формирование графика в папке AVIMA. Я не совсем понимаю, что не так в файле saverdm, из-за чего это происходит?

https://github.com/Taranks7/RDM_researchproject Если я плохо объяснил, что происходит, то это проект, над которым я работаю.

Спасибо

Ответы (1)

Когда вы хотите вызвать функцию python из другого файла, не стоит пытаться запустить другой процесс python, вызывая os.system. Просто импортируйте эту функцию: from plotrdm import plot_rdm

Вместо использования os.filewalk и проверки file.startswith мы можем значительно очистить код, используя хорошую библиотеку python glob. Я добавлю enumerate для примера.

Ваш новый rdmsave.py

import glob

from plotrdm import plot_rdm

basedir = "."

if __name__ == "__main__":
    count = 0
    for count, path in enumerate(sorted(glob.glob(f'{basedir}/**/Meadow*.json', recursive=True)), start=1):
        print(f "processing {path}")
        output_image = f'rdm_{count - 1:02}.png'
        print(f "выходное изображение будет {output_image}")
        plot_rdm(path, output_image)
    print(f "обработано {count} файлов")

Обратите внимание, что вам может понадобиться изменить basedir на ваш локальный путь.

И ваш plotrdm.py становится:

import numpy as np
импортировать matplotlib
import matplotlib.pyplot
import matplotlib.pyplot as plt
импортировать scipy
import scipy.spatial
import scipy.spatial.distance as sd
из scipy.spatial.distance import squareform
импортировать json
import matplotlib.pyplot as plt


def plot_rdm(fpath, output_filename):
    with open(fpath) as fhandle:
        data = json.load(fhandle)
        # проверить метки стимулов rdm

    stim = data['stimuli']

    # содержит все метки для оси y и оси x по отдельности
    y_names = []
    for i in stim:
        y_names.append(i['name'])

    x_names = []
    for i in stim:
        x_names.append(i['name'])

    # создайте массив rdm и квадратную форму
    rdm_array = np.array(data['rdm'])
    srdm = squareform(rdm_array)

    # обозначьте оси x и y на rdm
    fig, ax = plt.subplots()
    rdm = ax.imshow(srdm)

    ax.set_xticks(np.arange(len(x_names)))
    ax.set_yticks(np.arange(len(y_names)))

    ax.set_xticklabels(x_names)
    ax.set_yticklabels(y_names)
    plt.setp(ax.get_xticklabels(), rotation=90, ha="right", rotation_mode="anchor")
    plt.plot(srdm)
    plt.imshow(srdm)
    plt.colorbar(mappable=None, cax=None, ax=None)
    fig.subplots_adjust(bottom=0.23)

    plt.savefig(output_filename)

Я добавил второй аргумент output_filename в функцию plot_rdm, чтобы сделать возможным сохранение каждого изображения в новом файле.

Вывод на моей машине гласит

processing ./5/Meadows_avima-image-version1_v_v2_vital-macaw_2_tree.json
output image will be rdm_00.png
processing ./4/Meadows_avima-image-version1_v_v2_quick-louse_2_tree.json
output image will be rdm_01.png
processing ./1/Meadows_avima-image-version1_v_v2_better-hound_2_tree.json
output image will be rdm_02.png
processing ./3/Meadows_avima-image-version1_v_v2_huge-falcon_2_tree.json
output image will be rdm_03.png
processing ./2/Meadows_avima-image-version1_v_v2_guided-koi_2_tree.json
output image will be rdm_04.png
processed 4 files

В текущей папке создаются 4 png-файла.

2022 WebDevInsider