matplotlib散点图调用transData获取像素坐标数值过大问题求解
matplotlib散点图像素坐标获取数值异常排查
问题原因
- 调用坐标转换前未触发画布渲染:matplotlib采用懒加载渲染机制,
ax.transData.transform依赖的坐标系映射参数(画布dpi、轴量程、留白边距等)只有在画布完成首次绘制后才会计算完成,未渲染就直接转换会得到错误的超大数值。 - 补充说明:你给出的代码输出和代码逻辑不匹配(代码中x_labels只有3个值,输出有9组坐标),你实际运行的代码可能存在循环逻辑错误,也会导致数据维度异常。
修复方案
在调用ax.transData.transform前添加fig.canvas.draw()主动触发画布渲染即可,修复后代码如下:
import numpy as np import matplotlib.pyplot as plt x_labels = ['x1','x2','x3'] y_values = [30,40,50] coordList = [] x_vals = [] i = 0 fig, ax = plt.subplots() for item in x_labels: x_vals.append(i) i+=1 points, = ax.plot(x_vals, y_values) x, y = points.get_data() print(x, y) # 新增:主动触发画布渲染,完成坐标映射参数计算 fig.canvas.draw() xy_pixels = ax.transData.transform(np.vstack([x,y]).T) xpix, ypix = xy_pixels.T for xp, yp in zip(xpix, ypix): coordList.append(f'{xp:.2f}, {yp:.2f}') print(coordList)
验证效果
修复后输出的坐标数值会符合常规画布尺寸范围,y坐标普遍在100-700区间内,不会再出现几万的异常值。
内容的提问来源于stack exchange,提问作者AndrewWicks
相关产品推荐
相关产品推荐

