2015-04-19 3 views
1

У меня есть 10 изображений цифр 0-9, каждый с 28x28 пикселями, содержащихся в массиве X формы (28**2, 10).метод drawplot для подзаголовков

Я обновляю X с новыми пикселями внутри цикла, и я хотел бы обновить свой сюжет на каждой итерации.

В настоящее время мой код будет создавать 100 отдельных цифр.

def plot_output(X): 
    """grayscale images of the digits 0-9 
    in 28x28 pixels in pyplot 

    Input, X is of shape (28^2, 10) 
    """ 
    n = X.shape[1] # number of digits 
    pixels = (28,28) # pixel shape 
    fig, ax = plt.subplots(1,n) 

    # cycle through digits from 0-9 
    # X input array is reshaped for each 10 digits 
    # to a (28,28) vector to plot 
    for i in range(n): 
     wi=X[:,i] # w = weights for digit 

     wi=wi.reshape(*pixels) 
     ax[i].imshow(wi,cmap=plt.cm.gist_gray, 
      interpolation='gaussian', aspect='equal') 
     ax[i].axis('off') 
     ax[i].set_title('{0:0d}'.format(i)) 

    plt.tick_params(axis='x', which='both', bottom='off', 
     top='off', labelbottom='off') 

    plt.show() 

for i in range(100): 
    X = init_pix() # anything that generates a (728, 10) array 
    plot_output(X) 

Я попытался с помощью plt.draw() и pt.canvas.draw(), но я не могу показаться, чтобы правильно реализовать. Я также пробовал plt.clf(), который тоже не работал для меня.

Я смог сделать это с использованием линий и одной оси, используя this post, но я не могу заставить его работать на подзаговорах.

ответ

2

С помощью команды plt.ion() вы можете сделать команду plt.show(), то есть блокировку, а не блокировку.

Затем вы можете обновить оси с помощью imshow, и они появятся на вашем рисунке, когда они будут вычислены.

Например:

import numpy as np 
import matplotlib.pyplot as plt 

n=10 

X = np.random.rand(28**2,n) 

fig, ax = plt.subplots(1,n) 

plt.ion() 
plt.show() 

for i in range(n): 
    wi = X[:,1].reshape(28,28) 
    ax[i].imshow(wi) 

    #fig.canvas.draw() # May be necessary, wasn't for me. 

plt.ioff() # Make sure to make plt.show() blocking again, otherwise it'll run 
plt.show() # right through this and immediately close the window (if program exits) 

Теперь вы получите уродливую огромную пустую белую ось, пока ваши оси не определены, но это должно вам начать работу.

+0

спасибо! Это хорошо работает, я взял этот ответ с 'plt.ion()' и включил его в свой ответ. Я не обнаружил, что мне пришлось включать и отключать интерактивный режим, хотя –

+1

@alexmcf жаль, что неясно, ['plt.ion()'] (http://matplotlib.org/api/pyplot_api.html#matplotlib. pyplot.ion) на самом деле я имел в виду, включив его в интерактивном режиме. 'ion' предположительно означает ** I ** неактивный режим ** ВКЛ ** (обратите внимание на жирный шрифт). Если вам не нужно поворачиваться, если выключено после цикла, это интересно, потому что в моем тестировании, если бы я не отключал его, окончательный 'plt.show()' не блокировал бы, программа продолжалась бы, и когда это закончилось, сюжет был автоматически закрыт. – jedwards

+0

Спасибо, это был намек, который мне нужен :) для меня 'fig.canvas.draw()' было необходимо. – ppasler

0

Я нашел решение этой проблемы, создав класс участок и использование .cla() на каждой оси, а затем повторно определяя каждый с imshow()

class plot_output(object): 

    def __init__(self, X): 
     """grayscale images of the digits 1-9 
     """ 
     self.X = X 
     self.n = X.shape[1] # number of digits 
     self.pixels = (25,25) # pixel shape 
     self.fig, self.ax = plt.subplots(1,self.n) 
     plt.ion() 

     # cycle through digits from 0-9 
     # X input vector is reshaped for each 10 digits 
     # to a (28,28) vector to plot 
     self.img_obj_ar = [] 

     for i in range(self.n): 
      wi=X[:,i] # w = weights for digit 

      wi=wi.reshape(*self.pixels) 
      self.ax[i].imshow(wi,cmap=plt.cm.gist_gray, 
       interpolation='gaussian', aspect='equal') 
      self.ax[i].axis('off') 
      self.ax[i].set_title('{0:0d}'.format(i)) 

     plt.tick_params(\ 
      axis='x',   # changes apply to the x-axis 
      which='both',  # both major and minor ticks are affected 
      bottom='off',  # ticks along the bottom edge are off 
      top='off',   # ticks along the top edge are off 
      labelbottom='off') 

     plt.tick_params(\ 
      axis='y',   # changes apply to the y-axis 
      which='both',  # both major and minor ticks are affected 
      left='off', 
      right='off', # ticks along the top edge are off 
      labelleft='off') 

     plt.show() 

    def update(self, X): 

     # cycle through digits from 0-9 
     # X input vector is reshaped for each 10 digits 
     # to a (28,28) vector to plot 
     for i in range(self.n): 
      self.ax[i].cla() 
      wi=X[:,i] # w = weights for digit 

      wi=wi.reshape(*self.pixels) 
      self.ax[i].imshow(wi,cmap=plt.cm.gist_gray, 
          interpolation='gaussian', aspect='equal') 
      self.ax[i].axis('off') 
      self.ax[i].set_title('{0:0d}'.format(i)) 

     plt.draw() 
Смежные вопросы