ax.add_patch()存在坐标缩放不一致问题:matshow非正方矩阵时圆形适配异常
问题原因
你遇到的问题本质是坐标轴纵横比设置导致的坐标单位长度不匹配:matshow 方法默认开启了 aspect="equal" 配置,该配置会强制x轴和y轴的1个数据单位对应完全相同的屏幕像素长度。
- 当使用行列数相近的矩阵时,绘图区域可以正常适配画布尺寸,每个单元格保持正方形,半径0.5数据单位的圆形自然可以刚好嵌套进单元格。
- 当使用5行50列这类行列数差异极大的矩阵时,为了维持等比例规则,绘图区域会被自动缩放。如果你没有对应调整画布尺寸,或是手动设置了
aspect="auto"让绘图区域填满画布,就会导致x轴和y轴的1个数据单位对应的像素长度不再相等:y方向1数据单位的像素长度远大于x方向,半径0.5数据单位的圆形在y方向刚好适配单元格高度,但在x方向就会远超过单元格宽度,最终呈现出超出单元格的效果。
解决方案
方案一:调整画布尺寸适配矩阵比例
如果你希望单元格保持正方形,只需要设置画布的宽高比和矩阵的列行比一致即可:
import matplotlib.pyplot as plt from matplotlib.patches import Circle import numpy as np # 50列5行,宽高比设置为10:1即可适配,可根据需求微调预留边距 fig, ax = plt.subplots(figsize=(10, 1), dpi=500) mat = np.random.random((5,50)) ax.matshow(mat) ax.add_patch(Circle((2,2), .5, color='white')) plt.show()
方案二:改用椭圆适配任意纵横比
如果你需要让绘图区域填满画布,允许单元格为长方形,可以直接用Ellipse替代Circle,分别指定x、y方向的直径为1数据单位即可,无需调整画布尺寸:
import matplotlib.pyplot as plt from matplotlib.patches import Ellipse import numpy as np fig, ax = plt.subplots(dpi=500) mat = np.random.random((5,50)) ax.matshow(mat) # 中心坐标保持(2,2),宽高均设置为1个数据单位 ax.add_patch(Ellipse((2,2), width=1, height=1, color='white')) plt.show()
内容的提问来源于stack exchange,提问作者InertialObserver
相关产品推荐
相关产品推荐

