Matplotlib对图片的操作(2)——创建窗口及子窗口

import matplotlib.pyplot as plt

fig = plt.figure(figsize = (16, 4))		#创建一个像素大小为1600*400的窗口
ax  = plt.subplot(1,11,1)		# 将窗口分为1行16列的16个子图,可显示16张图片。第三个参数是针对第几个子图操作,如这里是针对第一个子图
ax.axis('off')		# 不显示坐标尺寸
imshow(img, 'first')		# 在第一个子图显示img,并在子图上命名query

# 同理,可以绘制剩下15张子图
ax = plt.subplot(1,11,2)	#针对第二张子图
ax.axis('off')
imshow(img2)
ax.set_title(2, color = 'red')		#在第二个子图上命名红色的2

fig.show()		#显示窗口
fig.savefig("show.png")		#保存在工作目录下并命名为show.png
matplotlib.pyplot.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None)

所有参数都是可选的,都有默认值,因此调用该函数时可以不带任何参数,其中:

num: 整型或字符型都可以。如果设置为整型,则该整型数字表示窗口的序号。如果设置为字符型,则该字符串表示窗口的名称。用该参数来命名窗口,如果两个窗口序号或名相同,则后一个窗口会覆盖前一个窗口。

figsize: 设置窗口大小。是一个tuple型的整数,如figsize=(8,8)

dpi: 整形数字,表示窗口的分辨率。

facecolor: 窗口的背景颜色。

edgecolor: 窗口的边框颜色。
matplotlib.pyplot.subplot(nrows, ncols, plot_number)

nrows: 子图的行数。

ncols: 子图的列数。

plot_number: 当前子图的编号。
### 如何在Python线程中正确使用Matplotlib进行绘图 当尝试在PyQt5应用程序的一个线程中启动Matplotlib GUI时,可能会遇到警告 `UserWarning: Starting a Matplotlib GUI outside of the main thread will likely fail.` 这是因为大多数GUI工具包设计为仅能在创建它们的那个特定线程(通常是主线程)内操作图形用户界面组件[^1]。 为了克服这个问题并允许从线程更新UI中的图表,可以采用一种策略,在主线程初始化FigureCanvas对象,并通过信号机制传递数据给主线程用于刷新视图。具体实现方式如下: #### 主要解决方案概述 - **分离计算逻辑与UI渲染**:保持所有的UI交互发生在主线程里;而耗时的数据处理或网络请求等工作可以在后台线程完成。 - **利用Qt Signals/Slots机制**:一旦后台工作结束,则发送信号通知主线程获取新数据并重新绘制图表。 #### 实现细节 下面是一个简单的例说明如何设置这样的架构: ```python import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget from PyQt5.QtCore import QObject, pyqtSignal, QThread import matplotlib.pyplot as plt from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas class PlotWorker(QObject): finished = pyqtSignal(list) def __init__(self, parent=None): super().__init__(parent) def do_work(self): # Simulate some work being done here... data_points = [[i * i for i in range(10)], [j + j for j in range(10)]] self.finished.emit(data_points) class MainWindow(QMainWindow): def __init__(self): super().__init__() central_widget = QWidget() layout = QVBoxLayout() fig, ax = plt.subplots(figsize=(8, 6)) self.canvas = FigureCanvas(fig) layout.addWidget(self.canvas) central_widget.setLayout(layout) self.setCentralWidget(central_widget) worker_thread = QThread() plot_worker = PlotWorker() plot_worker.moveToThread(worker_thread) plot_worker.finished.connect(self.update_plot) worker_thread.started.connect(plot_worker.do_work) worker_thread.start() def update_plot(self, points): self.canvas.figure.clear() ax = self.canvas.figure.add_subplot(111) ax.plot(points[0], label='Square') ax.plot(points[1], label='Double') ax.legend(loc="upper left") self.canvas.draw() if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.setWindowTitle('Multithreaded PyQT & Matplotlib Example') window.resize(900, 700) window.show() sys.exit(app.exec_()) ``` 这段代码展示了如何安全地在线程之间共享信息而不违反任何关于跨线程访问UI元素的规定。`PlotWorker` 类负责执行实际的工作负载——在这个案例中只是模拟了一些简单的时间序列数据生成过程——并通过发出带有结果列表的信号告知主窗口何时准备好新的数据显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值