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



我正试图在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, 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之前(

最新更新