Matplotlib中format_coord坐标显示被遮挡,如何调整位置?
解决方法
format_coord仅负责定义坐标提示的内容,无法控制其显示位置。要调整位置,需要从matplotlib的状态栏设置或自定义浮动文本框入手:
方法1:修改状态栏对齐
默认坐标提示显示在窗口底部状态栏,直接修改状态栏的对齐属性即可:
import matplotlib.pyplot as plt import numpy as np # 生成示例频谱图数据 freqs = np.linspace(0, 10, 100) times = np.linspace(0, 5, 200) spectrogram = np.random.rand(100, 200) fig, ax = plt.subplots() im = ax.pcolormesh(times, freqs, spectrogram) # 自定义坐标显示内容 def format_coord(x, y): # 计算对应位置的Z值 y_idx = int(y // (freqs[1] - freqs[0])) x_idx = int(x // (times[1] - times[0])) z = im.get_array()[y_idx, x_idx] return f'x={x:g}, y={y:g}, z={z:g}' ax.format_coord = format_coord # 获取状态栏并设置居中对齐 status_bar = fig.canvas.toolbar.statusbar status_bar.setAlignment('center') # 可选值:'left'/'right'/'center' plt.show()
方法2:自定义浮动文本框(更灵活)
如果状态栏调整无法满足需求,可以在绘图区域内添加一个跟随鼠标的浮动文本框,自由控制位置:
import matplotlib.pyplot as plt import numpy as np # 生成示例频谱图数据 freqs = np.linspace(0, 10, 100) times = np.linspace(0, 5, 200) spectrogram = np.random.rand(100, 200) fig, ax = plt.subplots() im = ax.pcolormesh(times, freqs, spectrogram) # 创建顶部居中的浮动文本框 text_box = ax.text(0.5, 0.95, '', transform=ax.transAxes, # 使用轴坐标系,0-1范围 ha='center', va='top', bbox=dict(boxstyle='round', facecolor='white', alpha=0.8)) def update_coord_text(event): if event.inaxes == ax: x, y = event.xdata, event.ydata if x is not None and y is not None: y_idx = int(y // (freqs[1] - freqs[0])) x_idx = int(x // (times[1] - times[0])) z = im.get_array()[y_idx, x_idx] text_box.set_text(f'x={x:g}, y={y:g}, z={z:g}') else: text_box.set_text('') fig.canvas.draw_idle() # 绑定鼠标移动事件 fig.canvas.mpl_connect('motion_notify_event', update_coord_text) plt.show()
通过修改text函数里的0.5(水平位置)和0.95(垂直位置),可以把文本框放在任意位置,比如0.1, 0.5就是左侧居中。
内容的提问来源于stack exchange,提问作者Krishna Neupane
相关产品推荐
相关产品推荐

