Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
178 views
in Technique[技术] by (71.8m points)

python - The axes of the plot won't show when start FuncAnimation

I have a problem with FuncAnimation. My problem is that the animation works, but the axes of the plot won't show anymore.

If I comment the animation part in the code out it will show the plot with the axes.

    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,

So I don't know why this happens and how I can solve it.

Full code underneath.

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())
question from:https://stackoverflow.com/questions/65862229/the-axes-of-the-plot-wont-show-when-start-funcanimation

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Do not create functions with names already used, in your case FigureCanvas is a class that inherits from QWidget and therefore also has the update() method. But override with an integer parameter causes that when internally called by maplotlib it fails causing a certain part not to be drawn. The solution is to change the name to a more descriptive one:

    # ...
    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,)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...