You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

固定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:20:24