如何解决启动 FuncAnimation 时不会显示图的轴
我有 FuncAnimation 的问题。我的问题是动画有效,但情节的轴将不再显示。
如果我注释掉代码中的动画部分,它将显示带有轴的图。
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,1),(1,1)])
self.state_y = np.array([(2,2)])
self.setup()
def setup(self):
state12 = self.ax.plot(self.state_x[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,linewidth=4)
self.anim = FuncAnimation(self.fig,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 是一个继承自 QWidget 的类,因此也具有 update()
方法。但是使用整数参数覆盖会导致当 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,)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。