2014-11-16 2 views
0

목록에서 상속 한 행렬 클래스가 있습니다. 이 클래스는 행렬의 matplotlib 히트 맵 표현으로 자신을 표시 할 수 있습니다.새 창을 만들지 않고 matplotlib 히트 맵 플로트를 업데이트하는 방법

매트릭스에서 값을 변경할 때 매트릭스의 메서드 plot()을 호출 할 수 있도록 클래스를 작성하려고합니다. 히트 맵의 매트릭스 변경 사항을 반영하도록 플롯을 업데이트합니다.

그러나, plot() 메서드를 실행할 때마다 기존 플롯을 업데이트하는 대신 새 윈도우에 히트 맵을 새로 만듭니다. 어떻게 간단히 으로 업데이트 할 수 있습니까? 기존의 플롯?

아래 코드에는 세 가지 주요 부분이 있습니다. main 함수는 행렬 클래스의 인스턴스가 만들어지고 플롯되고 업데이트되는 방법을 보여줍니다. 매트릭스 클래스는 기본적으로리스트 오브젝트이며, 약간의 기능 (플로팅 포함)이 볼트로 고정되어 있습니다. 함수 plotList()은 초기에 플롯 객체를 생성하기 위해 matrix 클래스가 호출하는 함수입니다.

import time 
import random 
import matplotlib.pyplot as plt 
plt.ion() 
import numpy as np 

def main(): 

    print("plot 2 x 2 matrix and display it changing in a loop") 
    matrix = Matrix(
     numberOfColumns = 2, 
     numberOfRows = 2, 
     randomise  = True 
    ) 
    # Plot the matrix. 
    matrix.plot() 
    # Change the matrix, redrawing it after each change. 
    for row in range(len(matrix)): 
     for column in range(len(matrix[row])): 
      input("Press Enter to continue.") 
      matrix[row][column] = 10 
      matrix.plot() 
    input("Press Enter to terminate.") 
    matrix.closePlot() 

class Matrix(list): 

    def __init__(
     self, 
     *args, 
     numberOfColumns   = 3, 
     numberOfRows    = 3, 
     element     = 0.0, 
     randomise    = False, 
     randomiseLimitLower  = -0.2, 
     randomiseLimitUpper  = 0.2 
     ): 
     # list initialisation 
     super().__init__(self, *args) 
     self.numberOfColumns  = numberOfColumns 
     self.numberOfRows  = numberOfRows 
     self.element    = element 
     self.randomise   = randomise 
     self.randomiseLimitLower = randomiseLimitLower 
     self.randomiseLimitUpper = randomiseLimitUpper 
     # fill with default element 
     for column in range(self.numberOfColumns): 
      self.append([element] * self.numberOfRows) 
     # fill with pseudorandom elements 
     if self.randomise: 
      random.seed() 
      for row in range(self.numberOfRows): 
       for column in range(self.numberOfColumns): 
        self[row][column] = random.uniform(
         self.randomiseLimitUpper, 
         self.randomiseLimitLower 
        ) 
     # plot 
     self._plot    = plotList(
             list = self, 
             mode = "return" 
            ) 
     # for display or redraw plot behaviour 
     self._plotShown   = False 

    def plot(self): 
     # display or redraw plot 
     self._plot.draw() 
     if self._plotShown: 
      #self._plot   = plotList(
      #       list = self, 
      #       mode = "return" 
      #      ) 
      array = np.array(self) 
      fig, ax = plt.subplots() 
      heatmap = ax.pcolor(array, cmap = plt.cm.Blues) 
      self._plot.draw() 
     else: 
      self._plot.show() 
      self._plotShown = True 

    def closePlot(self): 
     self._plot.close() 

def plotList(
    list = list, 
    mode = "plot" # plot/return 
    ): 
    # convert list to NumPy array 
    array = np.array(list) 
    # create axis labels 
    labelsColumn = [] 
    labelsRow = [] 
    for rowNumber in range(0, len(list)): 
     labelsRow.append(rowNumber + 1) 
     for columnNumber in range(0, len(list[rowNumber])): 
      labelsColumn.append(columnNumber) 
    fig, ax = plt.subplots() 
    heatmap = ax.pcolor(array, cmap = plt.cm.Blues) 
    # display plot or return plot object 
    if mode == "plot": 
     plt.show() 
    elif mode == "return": 
     return(plt) 
    else: 
     Exception 

if __name__ == '__main__': 
    main() 

저는 Ubuntu에서 Python 3을 사용하고 있습니다.

+0

[최소 예] (https://stackoverflow.com/help/mcve) – sebix

답변

1

plot(self) 메서드는 fig, ax = plt.subplots() 줄에 새 그림을 만듭니다. 가 처음 plotList()에서 만든 때 당신이 당신의 figure 번호 나 이름을 지정할 수 있습니다 기존의 그림을 사용하려면

fig = plt.figure('matrix figure') 
ax = fig.add_subplot(111) 

다음

plt.figure('matrix figure') 
ax = gca() # gets current axes 

활성 그림과 axes 있는지 확인하기 위해 사용합니다. 또는 그림과 축을 plotList에서 생성하고 plot으로 전달할 수 있습니다.

+0

을 제공해주십시오. 도움을 주셔서 감사합니다. 당신이 제안한대로, 플롯 생성 함수에서 figure 및 axes 객체를 반환했습니다. – d3pd