固定figsize的Matplotlib图中如何避免正方形/圆形变形?
解决Matplotlib非正方形画布中图形变形问题
在宽高比为12:5的画布中绘制正方形、圆形时出现变形,核心原因是Matplotlib默认会根据画布尺寸拉伸坐标轴,导致数据坐标的x、y方向视觉比例不一致。要维持画布宽高比同时避免图形变形,只需给坐标轴设置等比例显示即可。
修改后的代码
import matplotlib.pyplot as plt def draw(): ax.set_xlim(-1, 7) ax.set_ylim(-1, 7) ax.set_aspect('equal') # 确保ax坐标轴的x/y数据单位视觉长度一致 ax2.set_xlim(-1, 7) ax2.set_ylim(-1, 7) ax2.set_aspect('equal') # 给双轴也设置等比例 ax2.set_xticks([]) ax2.set_yticks([]) p = plt.Rectangle((0,0), 5, 5) ax.add_patch(p) ax2.add_patch(plt.Circle((0,0), 0.1, color="r")) ax2.add_patch(plt.Circle((0,5), 0.1, color="r")) ax2.add_patch(plt.Circle((5,0), 0.1, color="r")) ax2.add_patch(plt.Circle((5,5), 0.1, color="r")) def redraw(): ax2.clear() ax2.set_xticks([]) ax2.set_yticks([]) ax2.set_xlim(-1, 7) ax2.set_ylim(-1, 7) ax2.set_aspect('equal') # 清除轴内容后重新设置比例(避免被clear重置) ax2.add_patch(plt.Circle((0,0), 0.1, color="g")) ax2.add_patch(plt.Circle((0,5), 0.1, color="r")) ax2.add_patch(plt.Circle((5,0), 0.1, color="g")) ax2.add_patch(plt.Circle((5,5), 0.1, color="r")) fig, ax = plt.subplots(figsize=(12, 5)) # 保留原画布宽高比 ax2 = ax.twinx().twiny() draw() redraw() plt.show()
关键说明
set_aspect('equal')会强制Matplotlib让坐标轴上1个数据单位的长度,在x和y方向上视觉大小完全一致,这样正方形、圆形就能保持原本的形状。- 因为
ax2.clear()会清除轴的部分设置,所以在redraw函数中需要重新给ax2设置aspect='equal'。 - 画布宽高比(12:5)会被保留,图形不会变形,只是坐标轴会按比例适配画布,可能在画布两侧出现空白区域。
内容的提问来源于stack exchange,提问作者gameveloster
相关产品推荐
相关产品推荐

