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

matplotlib的ax对象使用set_aspect('equal')时如何绘制方形散点图

你可以直接在当前的ax对象上调用axis()方法传入'square'参数即可,无需使用plt的全局接口。你原有的代码仅需要做小幅调整,建议把坐标轴属性设置的逻辑放到循环外,避免重复执行冗余操作:

for row_output in results:
    for current_result in row_output:
        mat = np.stack([current_result.x, current_result.y]).T
        colors = current_result.rgb_values
        size = [100] * colors.shape[0]
        ax.scatter(x=mat[:, 0],
                   y=mat[:, 1],
                   c=colors,
                   s=size,
                   alpha=opacity)

# 两个属性叠加即可满足需求
ax.set_aspect('equal')
ax.axis('square')

原理解释

  • ax.set_aspect('equal')的作用是保证数据单位比例一致:即x轴的1个数据单位和y轴的1个数据单位对应的画布物理长度完全相等,避免图形出现拉伸形变
  • ax.axis('square')的作用是强制坐标轴的物理显示长度相等:即最终渲染出来的x轴和y轴的像素长度完全一致,不会出现一长一短的情况

如果需要更灵活的范围控制,可以手动对齐两个轴的数值范围,效果和axis('square')一致:

# 读取当前自动计算的轴范围
x_min, x_max = ax.get_xlim()
y_min, y_max = ax.get_ylim()
# 取两个轴范围的最大值作为统一的范围长度
max_span = max(x_max - x_min, y_max - y_min)
# 重新设置轴范围,保证两个轴跨度一致且图形居中
ax.set_xlim((x_min + x_max)/2 - max_span/2, (x_min + x_max)/2 + max_span/2)
ax.set_ylim((y_min + y_max)/2 - max_span/2, (y_min + y_max)/2 + max_span/2)
ax.set_aspect('equal')

内容的提问来源于stack exchange,提问作者Kenny Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:45:06