python matplotlib绘图,显示和保存没有标题栏和菜单栏的图像
目录
1. 使用plt.savefig保存无边框图形
2. 显示在屏幕上,并且去掉窗口的标题栏和工具栏
3. 通过配置 matplotlib 的 backend 和使用 Tkinter(或其他图形库)
方法 1:使用 TkAgg 后端,并禁用窗口的工具栏和标题栏
示例代码:
解释:
方法 2:使用 Agg 后端保存图片,不显示工具栏
示例代码:
解释:
方法 3:使用 matplotlib 和 pyautogui 截图窗口区域
示例代码:
解释:
总结:
不知道是不是有人和我一样在苦恼在截取python plt绘制的图像时,不能快速截取图像显示区(因为存在窗口的标题栏和工具栏,所以需要使用截图工具自己选择图像显示区),这样截取的图像,质量和大小不一定满意。
下面就是尝试解决这个问题。
1. 使用plt.savefig
保存无边框图形
如果你的目的是生成一个图形并保存为文件,而不是在屏幕上显示,可以使用plt.savefig
方法,并设置bbox_inches='tight'
参数来去除多余的空白边缘。此外,可以设置pad_inches=0
来进一步减少边缘空白。
import matplotlib.pyplot as plt
# 创建图形
plt.figure()
plt.plot([1, 2, 3], [4, 5, 6])
plt.title('Example Plot')
# 保存图形,去除多余空白
plt.savefig('plot.png', bbox_inches='tight', pad_inches=0)
# 清理
plt.close()
效果如下:
2. 显示在屏幕上,并且去掉窗口的标题栏和工具栏
import matplotlib.pyplot as plt
def on_key(event):
if event.key == 'escape': # 如果按下的是ESC键
plt.close(fig) # 关闭图像窗口
# 禁用工具栏
plt.rcParams['toolbar'] = 'None' # 禁用工具栏
# 使用 TkAgg 后端,适用于禁用工具栏和标题栏
plt.switch_backend('TkAgg')
# 创建图形
fig, ax = plt.subplots()
# 设置图形内容
ax.plot([1, 2, 3], [4, 5, 6])
ax.set_title('Example Plot')
# 去除标题栏并显示图像
fig.canvas.manager.window.overrideredirect(True) # 去除窗口的标题栏
fig.canvas.mpl_connect('key_press_event', on_key)
# 保持图形显示 5 秒(可以根据需要调整时间)
# plt.pause(5) # 这里是保持显示的时间
# 显示图形,直到手动关闭
plt.show(block=True)
在屏幕上显示:
这样很多截图工具(如weixin的alt+a)可以直接识别到整个区域。
在按下exc键的时候关闭图像:
import matplotlib.pyplot as plt
# 禁用工具栏
plt.rcParams['toolbar'] = 'None' # 禁用工具栏
# 使用 TkAgg 后端,适用于禁用工具栏和标题栏
plt.switch_backend('TkAgg')
# 创建图形
fig, ax = plt.subplots()
# 设置图形内容
ax.plot([1, 2, 3], [4, 5, 6])
ax.set_title('Example Plot')
# 去除标题栏并显示图像
fig.canvas.manager.window.overrideredirect(True) # 去除窗口的标题栏
# 定义按键事件回调函数
def on_key(event):
if event.key == 'escape': # 如果按下的是ESC键
plt.close(fig) # 关闭图像窗口
# 绑定按键事件
fig.canvas.mpl_connect('key_press_event', on_key)
# 保持图形显示 5 秒(可以根据需要调整时间)
# plt.pause(5) # 这里是保持显示的时间
# 显示图形,直到手动关闭
plt.show(block=True)
import matplotlib.pyplot as plt
# 禁用工具栏
plt.rcParams['toolbar'] = 'None' # 禁用工具栏
# 使用 TkAgg 后端,适用于禁用工具栏和标题栏
plt.switch_backend('TkAgg')
# 创建图形
fig, ax = plt.subplots()
# 设置图形内容
ax.plot([1, 2, 3], [4, 5, 6])
ax.set_title('Example Plot')
# 获取 Tkinter 窗口对象
window = fig.canvas.manager.window
# 去除窗口的标题栏
window.overrideredirect(True)
# 设置窗口始终保持在最前面
window.attributes('-topmost', 1) # 设置窗口为最上层
# 定义按键事件回调函数
def on_key(event):
if event.key == 'escape': # 如果按下的是ESC键
plt.close(fig) # 关闭图像窗口
# 绑定按键事件
fig.canvas.mpl_connect('key_press_event', on_key)
# 显示图形
plt.show(block=True)
3. 通过配置 matplotlib
的 backend
和使用 Tkinter
(或其他图形库)
要禁用 matplotlib
图形窗口中的工具栏和窗口标题栏,可以通过配置 matplotlib
的 backend
和使用 Tkinter
(或其他图形库)来进行窗口控制。下面是两种常用的方式,能够帮助你轻松获取需要的图像,避免工具栏和窗口标题栏。
方法 1:使用 TkAgg
后端,并禁用窗口的工具栏和标题栏
在 matplotlib
中,TkAgg
是一个常用的后端,它允许你通过 Tkinter
控制窗口。你可以创建一个没有标题栏和工具栏的窗口。
示例代码:
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import tkinter as tk
# 创建 Tkinter 窗口
root = tk.Tk()
# 禁用窗口标题栏
root.overrideredirect(True) # 取消标题栏
# 创建图形
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])
ax.set_title('Example Plot')
# 将图形嵌入 Tkinter 窗口
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
# 显示图形
canvas.get_tk_widget().pack()
# 设置窗口大小
root.geometry("400x300")
# 显示窗口
root.mainloop()
解释:
root.overrideredirect(True)
:这行代码会移除窗口的标题栏和工具栏,使得只有绘图区域显示在屏幕上。- 该方法只显示图形内容,去除了任何工具栏、标题栏和边框,非常适合截取图像。
方法 2:使用 Agg
后端保存图片,不显示工具栏
如果你的目的是直接保存图像而不是显示窗口,可以使用 Agg
后端来避免打开任何窗口(没有标题栏和工具栏),直接将图形保存为文件。
示例代码:
import matplotlib.pyplot as plt
# 切换到Agg后端,这样不会弹出窗口
plt.switch_backend('Agg')
# 创建图形
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])
ax.set_title('Example Plot')
# 保存图形,去除空白
fig.savefig('plot_without_toolbar.png', bbox_inches='tight', pad_inches=0)
# 清理
plt.close()
解释:
plt.switch_backend('Agg')
:切换到Agg
后端,这种后端不会弹出图形窗口,而是直接将图像保存为文件。这样就没有标题栏、工具栏,也不会弹出任何窗口。fig.savefig('plot_without_toolbar.png', bbox_inches='tight', pad_inches=0)
:保存图形时,使用bbox_inches='tight'
去除多余的空白。
方法 3:使用 matplotlib
和 pyautogui
截图窗口区域
如果你不希望关闭窗口,只是想截取窗口内容并去除工具栏和标题栏,可以使用 pyautogui
截取屏幕上的指定区域。你可以通过设置窗口的位置和尺寸,避免工具栏和标题栏的干扰。
示例代码:
import matplotlib.pyplot as plt
import pyautogui
import time
# 创建图形
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])
ax.set_title('Example Plot')
# 显示图形
plt.show(block=False)
# 等待图形显示
time.sleep(1)
# 获取屏幕截图,排除标题栏和菜单栏
screenshot = pyautogui.screenshot(region=(100, 100, 800, 600)) # 根据实际窗口调整区域
# 保存截图
screenshot.save('screenshot_no_toolbar.png')
print("Screenshot saved as 'screenshot_no_toolbar.png'")
# 清理
plt.close()
解释:
pyautogui.screenshot(region=(x, y, width, height))
:这行代码截取了屏幕的指定区域。你需要调整(x, y, width, height)
,使其排除标题栏和工具栏,仅截取绘图区域。
总结:
- 方法 1:使用
TkAgg
后端并禁用窗口标题栏和工具栏,可以让你只显示绘图区域。 - 方法 2:使用
Agg
后端,直接保存图像而不弹出任何窗口。 - 方法 3:使用
pyautogui
截取屏幕区域,以避免工具栏和标题栏的干扰。
这些方法可以帮助你轻松获取所需的图像,去除工具栏和标题栏的干扰。