【发布时间】:2022-01-18 12:59:11
【问题描述】:
我有一个FigureCanvasQTAgg,它通过用户选择要绘制的数据来创建绘图,并且画布通过调用self.fig.clear() 并创建新绘图来更新绘图。这工作得很好,但我遇到了一个问题。我在轴下设计了一个带有注释的绘图,但是每次更新图形时,绘图都会变得越来越小。这段代码复制了这个问题:
import sys
from PyQt5 import QtCore, QtWidgets
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg
class MplCanvas(FigureCanvasQTAgg):
def __init__(self, parent=None, width=5, height=4, dpi=100):
self.fig, self.axes = plt.subplots(figsize=(width, height), dpi=dpi, tight_layout=True)
super(MplCanvas, self).__init__(self.fig)
def make_plot(self, x, y, fmt='.k'):
self.fig.clear()
axes = self.fig.subplots()
axes.plot(x, y, fmt)
axes.invert_yaxis()
axes.annotate('I make the plot get smaller and smaller', xy=(0,0), xycoords='figure points', fontsize='x-small', fontstyle='italic', annotation_clip=False)
self.draw()
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
#Create a layout with central alignment
self.layout1 = QtWidgets.QVBoxLayout()
self.layout1.setAlignment(QtCore.Qt.AlignCenter)
# Create a placeholder widget to hold our toolbar and canvas.
self.widget1 = QtWidgets.QWidget()
self.widget1.setLayout(self.layout1)
self.setCentralWidget(self.widget1)
#Create a matplotlib canvas and add it to the layout
self.sc = MplCanvas(self, width=5, height=4, dpi=100)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed)
self.sc.setSizePolicy(sizePolicy)
self.layout1.addWidget(self.sc)
# Create a button
self.button = QtWidgets.QPushButton()
self.button.setText("Press me")
self.layout1.addWidget(self.button)
#Create the connection
self.button.clicked.connect(self.plot_something)
self.show()
def plot_something(self):
print('plotting')
x = [0,1,2,3,4]
y = [10,1,20,3,40]
self.sc.make_plot(x, y)
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
app.exec_()
在这个例子中,摆弄xycoords 参数有时可以解决它,例如使用xycoords='axes points' 或'data' 似乎有效。但这并不能解决我实际应用中的问题。禁用紧凑布局似乎也可以解决它,但由于各种原因我需要紧凑布局。
轴每次都变得越来越小的事实表明self.fig.clear() 实际上并没有清除所有内容 - 在情节的迭代之间会记住一些东西。有没有办法可以完全清除 fig 对象并开始一个新对象?还是最好每次关闭实际画布并创建一个新画布?
【问题讨论】:
标签: python matplotlib pyqt5