我正在 mac os x 上使用 python 和 matplotlib。 当我在许多不同的窗口上工作并且必须运行生成绘图的脚本时,绘图窗口总是在活动窗口后面打开,并且必须在窗口之间切换以查看图像非常令人沮丧。 是否有理由决定绘图窗口的位置,和/或将其弹出为前景窗口?
谢谢
对我来说(OSX 10.10.2,Matplotlib 1.4.3),有效的方法是将 matplotlib 后端更改为 TkAgg。 在导入 pyplot 或任何东西之前,请执行以下操作:
import matplotlib
matplotlib.use('TkAgg')
现在会弹出绘图窗口,并且可以通过 Command-Tab 进行操作。
我也被同样的问题困扰。我终于找到了一个解决方案(在 pylab 模式下,带有 qt4agg 后端):
get_current_fig_manager().window.raise_()
或
fig = gcf()
fig.canvas.manager.window.raise_()
问候, 马库斯
我发现经常需要这个解决方案(例如,当使用 Spyder IDE 时),我将其包装到一个函数中。
def show_plot(figure_id=None):
if figure_id is None:
fig = plt.gcf()
else:
# do this even if figure_id == 0
fig = plt.figure(num=figure_id)
plt.show()
plt.pause(1e-9)
fig.canvas.manager.window.activateWindow()
fig.canvas.manager.window.raise_()
我在这个帖子上找到了一个很好的答案: 如何让Tkinter窗口跳转到前面?
基本上,这个想法是使用窗口属性 - 将 '-topmost' 属性设置为 True (1) 以使窗口进入前台,然后将其设置为 False (0) 以便稍后允许其他窗口出现在它前面。这是对我有用的代码:
import matplotlib.pyplot as plt
wm = plt.get_current_fig_manager()
wm.window.attributes('-topmost', 1)
wm.window.attributes('-topmost', 0)
对于 MacOS Sierra 和 python 3.6,Matplotlib 2.0.0
import matplotlib.pyplot as plt
plt.get_current_fig_manager().show()
上面的行就可以完成工作,不需要任何其他东西。
这对我有用!!
(在 Mac OS X 10.11、Spyder 2.3.5.2 - Python 3.4 上测试)
进入 Preferences > IPython console > Graphics 并将后端设置为 Qt (之后需要重新启动内核)。
创建一个包含以下内容的文件:
def raise_window(figname=None):
if figname: plt.figure(figname)
cfm = plt.get_current_fig_manager()
cfm.window.activateWindow()
cfm.window.raise_()
并在启动时导入它(首选项 > IPython 控制台 > 启动 > 运行文件)。现在,只需调用代码下面的函数
raise_window()
即可。
示例:
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(-np.pi, np.pi, 256)
C, S = np.cos(X), np.sin(X)
plt.figure()
plt.plot(X, C)
plt.plot(X, S)
raise_window()
对我来说只有以下作品(使用 TkAgg 后端):
plt.gcf().canvas.get_tk_widget().focus_force()
从 MacOSX 10.11.6 上的 matplotlib 1.5.1 开始,如果您启动 iPython(5.0.0,Python:3.5.2)shell 并使用 %matplotlib,您可以使用以下命令将 matplotlib 图放在前面:
>>> %matplotlib
Using matplotlib backend: MacOSX
>>> import matplotlib.pyplot as plt
>>> plt.plot([1,3,2,4])
>>> plt.show()
** 编辑:建议似乎是不要使用%pylab,因为它会污染全局名称空间 **
.. shell 并使用
%pylab
您可以使用以下命令将 matplotlib 图放在前面:
>>> %pylab
Using matplotlib backend: MacOSX
Populating the interactive namespace from numpy and matplotlib
>>> plot([1,3,2,4])
>>> show()
可以设置
backend : MacOSX
在您的
matplotlibrc
文件中以获得永久解决方案。
它适用于我在 macos mojave 上使用 matplotlib 2.1.2。然而,其他用户抱怨说它对他们不起作用,所以它可能会受到其他设置的影响
以下内容适用于 Windows 上具有 Qt5 后端的 Jupyter 笔记本。我用Python 3.7,matplotlib 3.2.1测试了它。
%matplotlib qt5
import matplotlib.pyplot as plt
import numpy as np
from PyQt5 import QtCore
plt.plot(np.linspace(0,1))
window = plt.get_current_fig_manager().window
window.setWindowFlags(window.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
plt.show()
window.setWindowFlags(window.windowFlags() & ~QtCore.Qt.WindowStaysOnTopHint)
plt.show()
必须添加这两行,只是
*.raise_()
不起作用
fig.canvas.manager.window.activateWindow()
fig.canvas.manager.window.raise_()