목록에서 상속 한 행렬 클래스가 있습니다. 이 클래스는 행렬의 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을 사용하고 있습니다.
[최소 예] (https://stackoverflow.com/help/mcve) – sebix