Matplotlib:如何绘制带对数角度轴的极坐标图制作圆形计算尺
基于Matplotlib实现圆形对数刻度计算尺方案
核心实现思路
Matplotlib默认极坐标的θ轴仅支持角度/弧度线性刻度,无需强行修改原生轴属性,直接通过坐标映射手动绘制刻度、标签即可实现需求:
- 对数数值转角度映射规则:
- C/D标尺(单对数周期,取值范围1~10):
θ = log10(x) * 2π(对应360度完整周期) - A标尺(双对数周期,取值范围1~100):
θ = (log10(x)/2) * 2π - K标尺(三对数周期,取值范围1~1000):
θ = (log10(x)/3) * 2π
- C/D标尺(单对数周期,取值范围1~10):
- 刻度绘制逻辑:先计算不同数值对应的角度,再在指定径向位置绘制长短刻度线,最后添加刻度标签
单轴空白图实现方法
不需要加载任何绘图数据,创建画布轴对象后隐藏多余元素即可:
- 若用极坐标轴:隐藏不需要的径向轴、网格线、背景填充,仅保留需要绘制刻度的环形区域
- 若用笛卡尔轴做后处理:隐藏除目标轴外的所有元素,完成线性对数刻度绘制后再通过坐标转换拼接为圆形
可运行示例代码
import numpy as np import matplotlib.pyplot as plt # 创建极坐标画布 fig = plt.figure(figsize=(8,8), facecolor='white') ax = fig.add_subplot(111, projection='polar') # 隐藏原生刻度、网格、脊线 ax.set_xticklabels([]) ax.set_yticklabels([]) ax.grid(False) ax.spines['polar'].set_visible(False) # 设置极坐标范围,保证所有标尺在画布内 ax.set_ylim(0, 1.1) # 通用绘制标尺函数 def draw_log_ruler(radius, cycles, label, start_val=1, end_val=None): if end_val is None: end_val = 10 ** cycles # 绘制主刻度(1,2,...10) for x in np.arange(start_val, end_val+1): # 跳过重复的10/100等周期边界 if x % 10 == 0 and x != end_val: continue theta = (np.log10(x) / cycles) * 2 * np.pi # 长刻度线 ax.plot([theta, theta], [radius, radius+0.03], color='black', linewidth=1.5) # 刻度标签 ax.text(theta, radius+0.05, str(int(x)) if x%1==0 else f"{x:.1f}", ha='center', va='center', fontsize=9) # 绘制次刻度 for x in np.arange(start_val, end_val, 0.1): if round(x,1) %1 ==0: continue theta = (np.log10(x) / cycles) * 2 * np.pi ax.plot([theta, theta], [radius, radius+0.015], color='black', linewidth=0.8) # 标尺名称标注 ax.text(np.pi/2, radius+0.06, label, fontsize=10, weight='bold') # 绘制不同标尺 draw_log_ruler(radius=1.0, cycles=1, label='D') draw_log_ruler(radius=0.9, cycles=1, label='C') draw_log_ruler(radius=0.8, cycles=2, label='A') draw_log_ruler(radius=0.7, cycles=3, label='K') plt.show()
优化调整说明
- 若需要调整刻度方向为顺时针,可设置
ax.set_theta_direction(-1) - 若需要将0度起始位置调整到顶部,可设置
ax.set_theta_offset(np.pi/2) - 可根据需求调整刻度长度、标签大小、标尺间距等参数匹配实物样式
内容的提问来源于stack exchange,提问作者TheStumbler
相关产品推荐
相关产品推荐

