如何避免显示matplotlib大于2 ^ 16像素?

问题描述

我正在尝试在matplotlib图形中显示大量信号。我的界面中有一个值来设置信号之间的间距。我的问题是,如果该值太大,则会出现此错误:

ValueError:1266x121000像素的图像大小太大。每个方向上的距离都必须小于2 ^ 16。

和软崩溃。我想做的是避免软件崩溃。是否存在一种方法来检测是否会发生该错误,然后告知用户该值太大?我也可以将dpi调整为较大的数字,但无论如何仍然会出现错误。

这里是一个最小的示例:

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
import numpy as np
import matplotlib
matplotlib.use('Qt5Agg')
import matplotlib.pyplot as plt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

class Mon_Graph(QMainWindow):
    def __init__(self,parent=None):
        super(Mon_Graph,self).__init__()
        self.parent = parent
        self.centralWidget = QWidget()
        self.setCentralWidget(self.centralWidget)
        self.mainHBOX = QHBoxLayout()
        self.spacing_e = QLineEdit('1')
        self.mainHBOX.addWidget(self.spacing_e)
        self.graph= graphic(self)
        self.mainHBOX.addWidget(self.graph)
        self.centralWidget.setLayout(self.mainHBOX)

        self.Sigs = np.random.rand(100,100)*10
        self.spacing_e.editingFinished.connect(self.update_sigs)

    def update_sigs(self):
        self.graph.update()

class graphic(QGraphicsView):
    def __init__(self,parent=None):
        super(graphic,self).__init__(parent)
        self.parent = parent
        self.scene = QGraphicsScene(self)
        self.setScene(self.scene)
        self.figure = plt.figure(facecolor='white')
        self.canvas = FigureCanvas(self.figure)

        self.widget = QWidget()
        self.widget.setLayout(QVBoxLayout())
        self.scroll = QScrollArea(self.widget)
        self.scroll.setWidget(self.canvas)


        self.axes = self.figure.add_subplot(111)
        self.axes.set_xlabel("Time (s)")

        layout = QVBoxLayout()
        layout.addWidget(self.scroll)
        self.setLayout(layout)


    def update(self):
        Sigs = self.parent.Sigs 
        self.figure.clear()
        plt.figure(self.figure.number)
        plt.subplots_adjust(left=0.1,bottom=0.01,right=1,top=1,wspace=0.0,hspace=0.0 )
        self.axes = plt.subplot(1,1,1)
        spacing = float(self.parent.spacing_e.text())

        for i in range(Sigs.shape[0]):
            plt.plot(Sigs[i,:]+i*spacing)

        self.axes.autoscale(enable=True,axis='both',tight=True)

        self.canvas.setGeometry(0,self.parent.width()-100,(self.parent.height()-100)*spacing)
        self.canvas.draw_idle()

def main():
    app = QApplication(sys.argv)
    app.setStyle('Windows')
    ex = Mon_Graph(app)
    ex.showMaximized()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

如果我在lineedit中输入20,就可以了,但是如果我输入200,它会因先前的错误而崩溃。

解决方法

只需在您的更新方法中添加一个条件,以检查Sigs的两个维度是否都超过2 ^ 16(在调用plot之前)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...