Matplotlib Python使用patch.Circle绘制非等比坐标轴下正圆形问题
matplotlib非等比例坐标轴绘制正圆形解决方案
出现圆形变椭圆的核心原因是patches.Circle默认使用数据坐标系定义半径,当x、y轴的单位长度显示比例不一致时,圆就会被拉伸为椭圆。你可以根据需求选择以下三种方案解决:
- 方案1:调整坐标轴纵横比为1
如果你可以接受调整现有坐标轴的显示比例,直接添加一行设置即可让所有Circle自动显示为正圆:
ax.set_aspect('equal', adjustable='datalim') rect = patches.Circle(xy=(9, 206),radius= 2, linewidth=3, edgecolor='r', facecolor='red',alpha=0.5) ax.add_patch(rect)
该方案的优势是完全不需要修改你原有Circle的参数,缺点是会改变原有坐标轴的显示比例,适合对坐标轴布局没有严格要求的场景。
- 方案2:使用坐标轴归一化坐标绘制(推荐用于固定位置放置,比如你需要的左上角)
如果不想改变原有坐标轴比例,且你需要把圆放在固定的画布位置(比如左上角),可以切换为使用坐标轴归一化坐标系:坐标(0,0)对应坐标轴左下角,(1,1)对应右上角,半径也是相对于坐标轴长度的比例,不管数据坐标怎么变,绘制出来的都是正圆。示例代码如下:
# xy参数调整到你需要的左上角位置,(0.08, 0.92)代表距离左侧8%、距离顶部8%的位置 rect = patches.Circle(xy=(0.08, 0.92), radius=0.05, transform=ax.transAxes, linewidth=3, edgecolor='r', facecolor='red',alpha=0.5) ax.add_patch(rect)
你可以自行调整xy的数值和radius的大小,直到匹配你需要的位置和尺寸。
- 方案3:保留数据坐标位置,手动计算拉伸比例
如果你必须用数据坐标指定圆心位置,又不想改变坐标轴比例,可以手动计算x、y轴的显示比例,用Ellipse替代Circle绘制,调整两个方向的直径实现正圆效果:
# 获取坐标轴范围 x_min, x_max = ax.get_xlim() y_min, y_max = ax.get_ylim() x_range = x_max - x_min y_range = y_max - y_min # 获取坐标轴实际显示的像素比例 ax_width = ax.get_window_extent().width ax_height = ax.get_window_extent().height pixel_aspect = ax_height / ax_width # 你想要的圆的半径(x轴数据坐标下的尺寸) radius_x = 2 # 计算y轴数据坐标下的对应半径 radius_y = radius_x * (x_range / y_range) * pixel_aspect # 用Ellipse绘制,width和height是直径 rect = patches.Ellipse(xy=(9, 206), width=radius_x*2, height=radius_y*2, linewidth=3, edgecolor='r', facecolor='red',alpha=0.5) ax.add_patch(rect)
该方案可以完全保留你原有指定的圆心数据坐标,也不会改变坐标轴比例,适合对位置精度要求高的场景。
内容的提问来源于stack exchange,提问作者Keyreall
相关产品推荐
相关产品推荐

