pyplot绘制图像时TextBox输入坐标无法显示标记点问题求解
matplotlib TextBox提交坐标后无法绘制标记点修复
问题复现
功能目标:基于pyplot实现图像加载显示与交互标记,在显示的图像上叠加坐标点,点坐标通过TextBox控件输入提交。
异常表现:代码运行后可正常显示图像和底部输入框,但输入900,800格式的坐标按回车后,图像对应位置不会出现红色标记点。
原有问题代码:
import cv2 import numpy as np import matplotlib.pyplot as plt from matplotlib.widgets import TextBox def imshow_rgb(img_bgr): img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB) plt.imshow(img_rgb) ims = cv2.imread('plattegrondtekening.png', 1) fig = plt.imshow(np.flipud(ims), cmap='gray', origin='lower') plt.subplots_adjust(bottom=0.2) initial_text = "" x,y=[500,500] def submit(text): x,y = list(map(int,text.split(","))) print(x,y) plt.plot(x, y, "ro") plt.show() axbox = plt.axes([0.1, 0.05, 0.8, 0.075]) text_box = TextBox(axbox, 'search', initial=initial_text) text_box.on_submit(submit) plt.show()
错误原因
- 回调函数逻辑错误:
submit是事件触发的回调函数,内部重复调用plt.show()会阻塞事件循环,新绘制的内容无法触发渲染 - 缺少画布刷新步骤:matplotlib在交互控件回调中绘制新元素后,需要主动触发画布刷新才会显示新内容
- 变量接收错误:原代码用
fig接收plt.imshow()的返回值,实际该接口返回的是图像对象而非画布对象,后续无法正确操作画布 - 图像显示异常:cv2默认读取为BGR格式,原代码未做色彩空间转换直接用灰度colormap显示,会出现色彩错乱
修复后代码
import cv2 import numpy as np import matplotlib.pyplot as plt from matplotlib.widgets import TextBox # 读取图像并转换为RGB格式 ims = cv2.imread('plattegrondtekening.png', 1) img_rgb = cv2.cvtColor(ims, cv2.COLOR_BGR2RGB) # 创建画布与绘图轴,预留底部控件空间 fig, ax = plt.subplots() plt.subplots_adjust(bottom=0.2) # 显示翻转后的图像,匹配坐标原点方向 ax.imshow(np.flipud(img_rgb), origin='lower') initial_text = "" def submit(text): # 解析输入的x,y坐标 x, y = list(map(int, text.split(","))) print(f"标记坐标:x={x}, y={y}") # 绘制红色标记点,设置点大小保证可见 ax.plot(x, y, "ro", markersize=8) # 刷新画布,渲染新绘制的标记点 fig.canvas.draw_idle() # 初始化文本输入框 axbox = plt.axes([0.1, 0.05, 0.8, 0.075]) text_box = TextBox(axbox, '坐标输入(格式:x,y)', initial=initial_text) text_box.on_submit(submit) plt.show()
使用说明
- 运行代码后正常加载图像与底部输入框
- 输入
数字,数字格式的坐标(例如900,800),按下回车键即可在图像对应位置生成红色标记点 - 支持多次提交输入,可连续标记多个坐标点
内容的提问来源于stack exchange,提问作者user17825405
相关产品推荐
相关产品推荐

