[英]matplotlib FuncAnimation won't start on button press widget event
[英]The axes of the plot won't show when start FuncAnimation
我对 FuncAnimation 有疑问。 我的问题是 animation 可以工作,但是 plot 的轴将不再显示。
如果我在代码中注释 animation 部分,它将显示带有轴的 plot。
self.line, = self.ax.plot(self.state_x[0], self.state_y[0], '#000000', linewidth=4)
self.anim = FuncAnimation(self.fig, self.update, frames=4, interval=700, blit=True, repeat=True)
def update(self, i):
self.line.set_data([self.state_x[i], self.state_y[i]])
return self.line,
所以我不知道为什么会发生这种情况以及如何解决它。
完整代码如下。
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from PyQt5.QtWidgets import QWidget, QApplication, QRadioButton, QLabel
from PyQt5.QtGui import QFont
from PyQt5.QtCore import QRect, Qt
from matplotlib.animation import FuncAnimation
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import numpy as np
import sys
class Carnot(FigureCanvas):
def __init__(self, parent):
plt.ion()
self.fig = Figure(figsize=(5, 5), dpi=100)
self.ax = self.fig.add_subplot(111)
super().__init__(self.fig)
self.setParent(parent)
self.resize(800, 800)
self.state_x = np.array([(1, 2), (2, 2), (2, 1), (1, 1)])
self.state_y = np.array([(2, 2), (2, 1), (1, 1), (1, 2)])
self.setup()
def setup(self):
state12 = self.ax.plot(self.state_x[0], self.state_y[0], 'r', linewidth=3)
state23 = self.ax.plot(self.state_x[1], self.state_y[1], 'b', linewidth=3)
state34 = self.ax.plot(self.state_x[2], self.state_y[2], 'g', linewidth=3)
state41 = self.ax.plot(self.state_x[3], self.state_y[3], 'y', linewidth=3)
self.ax.set(xlabel="specific entropy s", ylabel="temperature T",
title="Carnot cycle")
self.ax.set_xticks([])
self.ax.set_yticks([])
self.ax.legend(("1 → 2 isothermal expansion", "2 → 3 isentropic expansion", "3 → 4 isothermal compression",
"4 → 1 isentropic compression"))
self.line, = self.ax.plot(self.state_x[0], self.state_y[0], '#000000', linewidth=4)
self.anim = FuncAnimation(self.fig, self.update, frames=4, interval=700, blit=True, repeat=True)
def update(self, i):
self.line.set_data([self.state_x[i], self.state_y[i]])
return self.line,
class Window(QWidget):
def __init__(self):
super(Window, self).__init__()
self.setWindowTitle("Name")
self.resize(1110, 800)
self.label_topic = QLabel("Carnot", self)
self.label_topic.setGeometry(QRect(10, 10, 291, 41))
self.label_topic.setFont(QFont("Arial", 12, QFont.Bold))
self.label_topic.setAlignment(Qt.AlignLeft)
self.radioButton1 = QRadioButton(self) # Carnot
self.radioButton1.setGeometry(QRect(20, 110, 91, 30))
self.radioButton1.setFont(QFont("Arial", 12))
self.radioButton1.setText("Carnot")
self.radioButton1.clicked.connect(self.ShowCarnot)
def ShowCarnot(self):
carnot_process = Carnot(self)
carnot_process.move(310, 0)
carnot_process.show()
App = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(App.exec())
不要创建已使用名称的函数,在您的情况下,FigureCanvas 是一个 class,它继承自 QWidget,因此也具有update()
方法。 但是用 integer 参数覆盖会导致当 maplotlib 在内部调用它时失败,导致某个部分不被绘制。 解决方案是将名称更改为更具描述性的名称:
# ...
self.anim = FuncAnimation(
self.fig,
self.update_animation,
frames=4,
interval=700,
blit=True,
repeat=True,
)
def update_animation(self, i):
self.line.set_data([self.state_x[i], self.state_y[i]])
return (self.line,)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.