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

如何用gnuplot的sprintf自动将角度以π分数形式显示在标题中

解决Gnuplot中角度自动以π分数形式显示在标题的方案

Gnuplot的sprintf本身没有直接将角度值转换为π分数或特殊无理数符号形式的功能,需要通过自定义函数实现自动转换逻辑,以下是具体可行方案:

核心思路

  1. 计算目标角度与π的比值,将比值转换为最简分数形式
  2. 拼接分数与希腊字母π(通过{/Symbol p}实现显示)
  3. 针对特殊无理数(如√2/2),可通过预定义数值匹配单独处理

实现代码示例

基础版:π分数自动转换

# 定义最大公约数计算函数(Gnuplot 5.0+内置gcd,旧版本需自行实现)
# 若你的Gnuplot版本无内置gcd,替换为:gcd(a,b) = b == 0 ? a : gcd(b, a % b)

# 角度转π分数字符串函数
angle_to_pi_str(angle) = _ratio = angle/pi; \
    _num = int(_ratio * 1000000); \
    _den = 1000000; \
    _g = gcd(_num, _den); \
    _num = _num / _g; \
    _den = _den / _g; \
    (_den == 1) ? sprintf("%d{/Symbol p}", _num) : sprintf("%d/%d{/Symbol p}", _num, _den)

# 测试使用
angle = (3*pi)/4
set title sprintf("the angle is %s radians", angle_to_pi_str(angle))
plot sin(x)

运行后标题会显示the angle is 3/4π radians,而非十进制数值。

进阶版:支持特殊无理数

如果需要处理如√2/2这类非π倍数的特殊值,可扩展函数添加数值匹配判断:

# 扩展角度转符号字符串函数
angle_to_sym_str(angle) = \
    (abs(angle - sqrt(2)/2) < 1e-6) ? "{/Symbol \265}2/2" : \
    (abs(angle - pi/3) < 1e-6) ? "1/3{/Symbol p}" : \
    (abs(angle - 2*pi/3) < 1e-6) ? "2/3{/Symbol p}" : \
    angle_to_pi_str(angle)

# 测试特殊值
angle = sqrt(2)/2
set title sprintf("the value is %s", angle_to_sym_str(angle))
plot cos(x)

这里{/Symbol \265}是Symbol字体中根号的对应字符,可实现√的显示。

关键说明

  • 代码中通过乘以1e6取整再约分的方式,避免浮点数精度问题导致的分数不准确
  • 若使用旧版本Gnuplot,需自行实现gcd函数(代码中已给出注释版)
  • 你提到的图例标题技巧,同样可以套用上述函数,只需将t sprintf(...)替换为t angle_to_pi_str(...)即可

内容的提问来源于stack exchange,提问作者Bryan-StackExchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 02:41:25