如何让matplotlib.pyplot在指定外接显示器绘制图形?
让matplotlib在macOS指定外接显示器创建窗口
macOS下matplotlib默认把绘图窗口放在自带屏幕,要程序化指定外接显示器,可通过切换后端并控制窗口位置实现,以下是两种可行方案:
方案一:基于TkAgg后端
Tk后端支持直接设置窗口几何位置,需先确定外接显示器的坐标(可通过系统设置→显示器→按住Option点击「缩放」查看坐标,或用代码获取)。
- 指定TkAgg后端并导入库:
import matplotlib matplotlib.use('TkAgg') import matplotlib.pyplot as plt
- 创建图形后,调整窗口位置到目标显示器:
fig = plt.figure() # 获取Tk窗口实例 window = fig.canvas.manager.window # 格式:"宽度x高度+X坐标+Y坐标",示例中外接显示器左上角坐标为(1920, 0) window.geometry("800x600+1920+0") plt.plot([1, 2, 3]) plt.show()
方案二:基于QtAgg后端
Qt后端能更便捷地获取系统显示器信息,需依赖PyQt5或PySide2。
- 指定QtAgg后端并导入库:
import matplotlib matplotlib.use('QtAgg') import matplotlib.pyplot as plt from PyQt5 import QtWidgets
- 选择目标显示器并移动窗口:
fig = plt.figure() # 确保Qt应用实例存在 app = QtWidgets.QApplication.instance() or QtWidgets.QApplication([]) window = fig.canvas.manager.window # 获取所有显示器,screens[0]通常是自带屏,screens[1]、screens[2]为外接屏 screens = app.screens() target_screen = screens[1] # 获取目标显示器的坐标区域,将窗口移到该区域 screen_geo = target_screen.geometry() window.setGeometry(screen_geo.x(), screen_geo.y(), 800, 600) plt.plot([1, 2, 3]) plt.show()
辅助工具:获取显示器坐标/索引
不确定显示器的坐标或索引时,可通过以下代码获取:
用PyObjC获取系统显示器信息(通用)
from AppKit import NSScreen for idx, screen in enumerate(NSScreen.screens()): frame = screen.frame() print(f"显示器{idx}: 坐标({frame.origin.x}, {frame.origin.y}),分辨率({frame.size.width}x{frame.size.height})")
Qt后端直接查看
from PyQt5 import QtWidgets app = QtWidgets.QApplication([]) for idx, screen in enumerate(app.screens()): geo = screen.geometry() print(f"显示器{idx}: 坐标({geo.x()}, {geo.y()}),分辨率({geo.width()}x{geo.height()})")
注意事项
- 若默认后端无法控制窗口位置,必须先切换到TkAgg或QtAgg。
- 使用QtAgg需先安装依赖:
pip install pyqt5 - 坐标数值需根据你的实际显示器布局调整,确保窗口落在目标显示器范围内。
内容的提问来源于stack exchange,提问作者bphi
相关产品推荐
相关产品推荐

