2015-11-09 2 views
1

Я написал несколько Python в IDE Spyder, чтобы построить пару изображений бок о бок, чтобы я мог визуально осмотреть их. Мне нужно всего лишь 3 секунды, чтобы смотреть на них большую часть времени, но каждый раз в то время мне нужно больше поглядывать. Поэтому, я не использовал time.sleep, вместо этого я закодировал ждать для меня, чтобы нажать клавишу Enter, как показано ниже:ускорить нанесение изображений в matplotlib

import matplotlib.pyplot as plt 
import os 

def VI_segmentation(): 
    root = os.getcwd() 
    NR_dir = root + '\\Neurite_Results\\' 
    SO_dir = root + '\\Segmentation_Overlays\\' 
    jpgs = os.listdir(NR_dir) 
    fig = plt.figure(figsize=(20,12)) 
    for jpg in jpgs: 
     fig.suptitle(jpg , fontsize=14, fontweight='bold') 
     image_NR = plt.imread(NR_dir + jpg) 
     image_SO = plt.imread(SO_dir + jpg) 
     plt.subplot(121) 
     plt.imshow(image_NR) 
     plt.subplot(122) 
     plt.imshow(image_SO) 
     plt.draw() 
     plt.pause(0.01) 

     input('Press Enter to continue') 

VI_segmentation() 

Проблема заключается в том, что я думаю, быстрее, чем мой компьютер :). Требуется 5-6 секунд для того, чтобы компьютер стал реагировать на клавишу Enter и еще несколько секунд, чтобы обновить его после ответа. Делает для паршивой эргономики при прокручивании через сотни изображений, которые в основном прекрасны. Любые идеи по оптимизации этого кода будут высоко оценены.

+1

Из-за того, что у вас нет этих изображений, вам необходимо предоставить дополнительную информацию. По крайней мере, что точно работает на вашей машине, прочитайте это о профилировании: http://stackoverflow.com/questions/5478351/python-time-measure-function – fghj

ответ

1

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

вы можете попробовать GTKAgg бэкенд, как описано в ответ: https://stackoverflow.com/a/30655528/2632856

попробуйте добавить вторую строку кода после оператора импорта Matplotlib.

import matplotlib 
matplotlib.use('GTKAgg') 

Есть другие серверы, с которыми вы можете экспериментировать. Смотрите эту ссылку для доступных движков, http://matplotlib.org/faq/usage_faq.html#what-is-a-backend

5

Эта версия кода, в конечном счете решить мою проблему:

import matplotlib.pyplot as plt 
import os 

def VI_segmentation(): 
    plt.ion() 
    root = os.getcwd() 
    NR_dir = root + '\\Neurite_Results\\' 
    SO_dir = root + '\\Segmentation_Overlays\\' 
    jpgs = os.listdir(NR_dir) 
    f = plt.figure(figsize=(22,12)) 
    ax1 = f.add_subplot(121) 
    ax2 = f.add_subplot(122) 
    image_NR = plt.imread(NR_dir + jpgs[0]) 
    image_SO = plt.imread(SO_dir + jpgs[0]) 
    im1 = ax1.imshow(image_NR) 
    im2 = ax2.imshow(image_SO) 
    f.suptitle(jpgs[0] , fontsize=14, fontweight='bold') 
    f.show() 
    plt.pause(0.01) 
    input('Press Enter to continue') 

    for jpg in jpgs[1:]: 
     f.suptitle(jpg , fontsize=14, fontweight='bold') 
     image_NR = plt.imread(NR_dir + jpg) 
     image_SO = plt.imread(SO_dir + jpg) 
     im1.set_data(image_NR) 
     im2.set_data(image_SO) 
     f.canvas.draw() 
     plt.pause(0.01) 
     input('Press Enter to continue') 

VI_segmentation() 

Ключ в том, чтобы изменить данные в сюжете, а не добавлять новый сюжет. Этот ответ был полезен для меня.

Why does my pylab animation slow down with each update?

Как ни странно, когда я начал менять сюжетные данные вместо replotting, я начал получать странное поведение, где эта цифра ниже, но окружающая окно не будет. Так или иначе, этот fig.set_size_inches сломался, поэтому я перешел к созданию фигуры и созданию оси, чтобы установить размер фигуры, когда фигура была сделана.

Смежные вопросы