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

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π
  • 刻度绘制逻辑:先计算不同数值对应的角度,再在指定径向位置绘制长短刻度线,最后添加刻度标签

单轴空白图实现方法

不需要加载任何绘图数据,创建画布轴对象后隐藏多余元素即可:

  • 若用极坐标轴:隐藏不需要的径向轴、网格线、背景填充,仅保留需要绘制刻度的环形区域
  • 若用笛卡尔轴做后处理:隐藏除目标轴外的所有元素,完成线性对数刻度绘制后再通过坐标转换拼接为圆形

可运行示例代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:57:04