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
相关产品推荐
相关产品推荐

