投影与径向轴#
用途与概念#
polar 用角度 theta 和半径 r 表示数据。它的默认 0° 朝右、正方向逆时针,与页面线段 angle 的顺时针 y 向下约定不同;angle_unit 决定数据角度单位。
最小完整示例#
此文件包含画布及必要定义,可直接运行 laymesh validate 或 laymesh render,不依赖前文未声明的变量。
# Minimal complete example: plotpage=canvas(size=(100mm,75mm),background="#ffffff")p=plot(size=(86mm,62mm),x=axis(range=(0,4)),y=axis(range=(0,5)))p.line(x=[0,1,2,3],y=[1,2,4,3],label="Signal")page.add(p,offset=(7mm,6mm))# Minimal complete example: plotpage=canvas(size=(100mm,75mm),background="#ffffff")p=plot(size=(86mm,62mm),x=axis(range=(0,4)),y=axis(range=(0,5)))p.line(x=[0,1,2,3],y=[1,2,4,3],label="Signal")page.add(p,offset=(7mm,6mm))预览
依赖文件
examples/manual/plot.lay
参数与默认行为#
裸几何长度使用画布单位,裸字号和描边宽度使用 pt。显式调用参数优先于继承和主题默认值;下面的接口参考逐项列出允许类型、可选值与默认来源。
组合用法#
设置 theta_zero、theta_direction、inner_radius 可形成仪表或环形图。wrap=shortest 跨周期走最短方向,raw 保留角度差;interpolation=polar 与 chord 分别在数据与页面中连接。
page=canvas(size=(205 mm,120 mm),background="#ffffff")s=plot_style(font_family="DejaVu Sans",font_size=7 pt,grid_color="#dddddd")p=plot(projection= polar,size=(98 mm,100 mm),plot_area=box(offset=(18 mm, 18 mm), size=(62 mm, 62 mm)),style=s, theta=axis(ticks=[0,90,180,270],grid= major),r=axis(range=(0,5),ticks=[1,3,5],grid= major,tick_font_size=6 pt))a=p.line(theta=[0,45,90,135,180,225,270,315],r=[4.5,3,1.6,2.5,4,2.8,1.3,3.4],closed=true,marker= diamond,marker_size=1.7 mm,color="#264b69",label="Response")p.line(theta=[350,10],r=[4,4],color="#b65337",line_width=0.6 mm,label="350 to 10 degrees")p.scatter(theta=[180],r=[-4.5],marker= circle,marker_size=3 mm,marker_fill="none",marker_border_color="#b65337",marker_border_width=0.3 mm)c=page.add(p,offset=(3 mm,4 mm))page.add(text(content="(a) Directional response",font_family="DejaVu Sans",font_size=9 pt),target=c.plot_top_left,offset=(-4 mm,-15 mm))page.add(text(content="Peak",font_family="DejaVu Sans",font_size=7 pt),target=c.data(theta=0,r=4.5),offset=(-12 mm,-6 mm))q=plot(projection= polar,size=(98 mm,100 mm),plot_area=box(offset=(18 mm, 18 mm), size=(62 mm, 62 mm)),style=s,theta_zero=90 deg,theta_direction="cw", theta=axis(ticks=[0,90,180,270],tick_text=["N","E","S","W"],grid= major),r=axis(range=(0,5),ticks=[1,3,5],grid= major,tick_font_size=6 pt))q.line(theta=[0,45,90,135,180,225,270,315],r=[4.5,3,1.6,2.5,4,2.8,1.3,3.4],closed=true,marker= diamond,marker_size=1.7 mm,color="#264b69")d=page.add(q,offset=(103 mm,4 mm))page.add(text(content="(b) North / clockwise",font_family="DejaVu Sans",font_size=9 pt),target=d.plot_top_left,offset=(-4 mm,-15 mm))page.add(legend(layers=[a],style=s),offset=(12 mm,103 mm))page.add(text(content="Negative radius: same point after a half-turn (warning can be hidden).",font_family="DejaVu Sans",font_size=7 pt),offset=(53 mm,107 mm))# BEGIN DEMOpage=canvas(size=(205 mm,120 mm),background="#ffffff")s=plot_style(font_family="DejaVu Sans",font_size=7 pt,grid_color="#dddddd")p=plot(projection= polar,size=(98 mm,100 mm),plot_area=box(offset=(18 mm, 18 mm), size=(62 mm, 62 mm)),style=s, theta=axis(ticks=[0,90,180,270],grid= major),r=axis(range=(0,5),ticks=[1,3,5],grid= major,tick_font_size=6 pt))a=p.line(theta=[0,45,90,135,180,225,270,315],r=[4.5,3,1.6,2.5,4,2.8,1.3,3.4],closed=true,marker= diamond,marker_size=1.7 mm,color="#264b69",label="Response")p.line(theta=[350,10],r=[4,4],color="#b65337",line_width=0.6 mm,label="350 to 10 degrees")p.scatter(theta=[180],r=[-4.5],marker= circle,marker_size=3 mm,marker_fill="none",marker_border_color="#b65337",marker_border_width=0.3 mm)c=page.add(p,offset=(3 mm,4 mm))page.add(text(content="(a) Directional response",font_family="DejaVu Sans",font_size=9 pt),target=c.plot_top_left,offset=(-4 mm,-15 mm))page.add(text(content="Peak",font_family="DejaVu Sans",font_size=7 pt),target=c.data(theta=0,r=4.5),offset=(-12 mm,-6 mm))q=plot(projection= polar,size=(98 mm,100 mm),plot_area=box(offset=(18 mm, 18 mm), size=(62 mm, 62 mm)),style=s,theta_zero=90 deg,theta_direction="cw", theta=axis(ticks=[0,90,180,270],tick_text=["N","E","S","W"],grid= major),r=axis(range=(0,5),ticks=[1,3,5],grid= major,tick_font_size=6 pt))q.line(theta=[0,45,90,135,180,225,270,315],r=[4.5,3,1.6,2.5,4,2.8,1.3,3.4],closed=true,marker= diamond,marker_size=1.7 mm,color="#264b69")d=page.add(q,offset=(103 mm,4 mm))page.add(text(content="(b) North / clockwise",font_family="DejaVu Sans",font_size=9 pt),target=d.plot_top_left,offset=(-4 mm,-15 mm))page.add(legend(layers=[a],style=s),offset=(12 mm,103 mm))page.add(text(content="Negative radius: same point after a half-turn (warning can be hidden).",font_family="DejaVu Sans",font_size=7 pt),offset=(53 mm,107 mm))# END DEMO预览
依赖文件
examples/plot/polar-directions.lay
常见错误与限制#
负半径按角度加半圈后取绝对值,并发出警告;对数径向轴要求正值。plot_* 仍指投影矩形,实际角度轴线应通过 axes 的 spine 查询。
逐项功能说明#
详细行为与补充示例#
参数#
| 参数 | 用途 | 默认或要求 |
|---|---|---|
plot_area |
投影所在矩形 | 圆心在矩形中心 |
theta / r |
角度与半径轴 | 原始数据单位 |
常见用法#
完整源码。右图采用北向零度、顺时针方向;左图圆圈使用负半径,与反向半周的正半径点重合,产生可隐藏的预期警告。
| 设置 | 默认及行为 |
|---|---|
projection |
cartesian;新增 polar 和 radar |
angle_unit |
deg;可选 rad,控制无单位角数据、范围、刻度、误差和柱宽 |
theta_zero |
0 deg,从页面向右方向逆时针旋转的角度;例如 90 deg 指向上方 |
theta_direction |
ccw;可选 cw |
theta=axis(...) |
线性角轴,默认整圆;显式递增范围不超过一周,跨零度扇区写作 (300,420) |
r=axis(...) |
线性、log 或 symlog,支持反向、字号、颜色、富文本、科学计数法及独立偏移;范围非负,log 范围为正 |
r_label_angle |
22.5 deg,径向轴及其刻度所在角方向,跟随零度位置和方向 |
inner_radius |
0 mm;可设物理内孔,须小于外半径;径向范围映射到内外半径之间 |
wrap |
曲线默认 shortest;350→10 沿短角路径,恰好半周保留原差值方向;raw 保留数值角度差,适用于多圈 |
interpolation |
默认 polar,在角度/半径空间插值后投影;chord 直接连接投影端点 |
closed |
普通曲线默认 false;设 true 连接末端与起点 |
theta/r 的 range、ticks 和数据使用无单位数值,单位由 angle_unit 解释;theta_zero/r_label_angle 使用现有 deg 物理角度语法。角刻度默认显示度数,弧度显示数值;需要 π 分数可用 tick_text 配合公式。未指定径向范围时线性尺度从零开始,log 使用有效半径的正值范围。
a.data(theta=...,r=...) 使用原始值,超出扇区或径向范围时报错。a.plot_* 九个锚点仍引用绘图区矩形;a.axis(name="theta|r",anchor="start|center|end") 引用外圆弧或径向射线,center 为物理弧长/径向长度的中点。随后再执行图表旋转、组缩放和容器偏移。
负半径按 (theta+半周, abs(r)) 投影,发出 W_POLAR_NEGATIVE_RADIUS;不修改输入数组。连续路径在原始半径过零处切分,误差端帽只画在真实且可见的端点。对数半径不接受实际零值;零基线和跨零误差区间先裁剪再取对数。圆弧和投影曲线的局部细分误差上限为 0.001 mm,锚点使用解析坐标。

