多轴与断轴#
用途与概念#
命名轴允许图层选择自己的数值映射。主轴是 x/y;add_axis 给新增轴唯一名称和 left/right/top/bottom 位置,图层通过 x_axis/y_axis 绑定。
最小完整示例#
此文件包含画布及必要定义,可直接运行 laymesh validate 或 laymesh render,不依赖前文未声明的变量。
# Minimal complete example: plot.add_axispage=canvas(size=(100mm,75mm),background="#ffffff")p=plot(size=(86mm,62mm),x=axis(range=(0,4)),y=axis(range=(0,5)))p.add_axis(name="right_y",side=right,axis=axis(range=(0,10),label="Second scale"))p.line(x=[0,1,2,3],y=[1,2,4,3],y_axis="right_y")page.add(p,offset=(7mm,6mm))# Minimal complete example: plot.add_axispage=canvas(size=(100mm,75mm),background="#ffffff")p=plot(size=(86mm,62mm),x=axis(range=(0,4)),y=axis(range=(0,5)))p.add_axis(name="right_y",side=right,axis=axis(range=(0,10),label="Second scale"))p.line(x=[0,1,2,3],y=[1,2,4,3],y_axis="right_y")page.add(p,offset=(7mm,6mm))预览
依赖文件
examples/manual/plot-add_axis.lay
参数与默认行为#
裸几何长度使用画布单位,裸字号和描边宽度使用 pt。显式调用参数优先于继承和主题默认值;下面的接口参考逐项列出允许类型、可选值与默认来源。
组合用法#
一条副轴曲线可与主轴柱图叠放。各轴独立设置 breaks 和 segment_lengths;数据锚点必须使用同一轴名称,才能与相应图层保持一致。
# Independent axis gaps. Lengths are literal mm, not stretch factors.page=canvas(size=(210 mm,128 mm),background="#ffffff")s=plot_style(font_family="DejaVu Sans",font_size=8 pt)p=plot(size=(195 mm,112 mm),plot_area=box(offset=(24 mm, 20 mm), size=(110 mm, 62 mm)),style=s, x=axis(label="Time (s)",range=(0,10),ticks=[0,1,2,8,9,10],breaks=[(2,8)],break_gap=3 mm,segment_lengths=[45 mm,62 mm],minor_ticks="auto"), y=axis(label="Signal (a.u.)",range=(0,100),ticks=[0,5,80,90,100],breaks=[(10,80)],break_gap=2 mm,segment_lengths=[20 mm,40 mm],line_color="#264b69"))p.add_axis(name="temperature",side= right,offset=0 mm, axis=axis(label="Temperature (K)",range=(200,1000),ticks=[200,400,800,1000],breaks=[(400,800)],break_gap=4 mm,segment_lengths=[29 mm,29 mm],line_color="#a04725"))p.add_axis(name="pressure",side= right,offset=29 mm, axis=axis(label="Pressure (MPa)",range=(0,100),ticks=[0,25,50,75,100],line_color="#34705a"))a=p.line(x=[0,1,2,8,9,10],y=[1,5,9,84,92,98],marker= circle,color="#264b69",label="Signal")b=p.line(x=[0,1,2,8,9,10],y=[220,300,380,830,910,980],y_axis="temperature",marker= diamond,color="#a04725",label="Temperature")c=p.line(x=[0,1,2,8,9,10],y=[15,26,40,55,72,91],y_axis="pressure",line_dash=[2 mm,1 mm],color="#34705a",label="Pressure")p.errorbar(x=[1,9],y=[5,91],yerr=[4,8],color="#264b69",cap_size=2 mm)chart=page.add(p,offset=(6 mm,8 mm))page.add(text(content="Independent gaps on three vertical axes",font_family="DejaVu Sans",font_size=10 pt),target=chart.plot_top_left,offset=(0 mm,-14 mm))page.add(legend(layers=[a,b,c],columns=3,gap=3 mm,background="none"),target=chart.plot_bottom_left,offset=(0 mm,23 mm))# This data anchor uses temperature values, including its independent break.page.add(text(content="T",font_family="DejaVu Sans",font_size=8 pt,color="#a04725"),anchor=bottom_left,target=chart.data(x=9,y=910,y_axis="temperature"),offset=(2 mm,-2 mm))# BEGIN DEMO# Independent axis gaps. Lengths are literal mm, not stretch factors.page=canvas(size=(210 mm,128 mm),background="#ffffff")s=plot_style(font_family="DejaVu Sans",font_size=8 pt)p=plot(size=(195 mm,112 mm),plot_area=box(offset=(24 mm, 20 mm), size=(110 mm, 62 mm)),style=s, x=axis(label="Time (s)",range=(0,10),ticks=[0,1,2,8,9,10],breaks=[(2,8)],break_gap=3 mm,segment_lengths=[45 mm,62 mm],minor_ticks="auto"), y=axis(label="Signal (a.u.)",range=(0,100),ticks=[0,5,80,90,100],breaks=[(10,80)],break_gap=2 mm,segment_lengths=[20 mm,40 mm],line_color="#264b69"))p.add_axis(name="temperature",side= right,offset=0 mm, axis=axis(label="Temperature (K)",range=(200,1000),ticks=[200,400,800,1000],breaks=[(400,800)],break_gap=4 mm,segment_lengths=[29 mm,29 mm],line_color="#a04725"))p.add_axis(name="pressure",side= right,offset=29 mm, axis=axis(label="Pressure (MPa)",range=(0,100),ticks=[0,25,50,75,100],line_color="#34705a"))a=p.line(x=[0,1,2,8,9,10],y=[1,5,9,84,92,98],marker= circle,color="#264b69",label="Signal")b=p.line(x=[0,1,2,8,9,10],y=[220,300,380,830,910,980],y_axis="temperature",marker= diamond,color="#a04725",label="Temperature")c=p.line(x=[0,1,2,8,9,10],y=[15,26,40,55,72,91],y_axis="pressure",line_dash=[2 mm,1 mm],color="#34705a",label="Pressure")p.errorbar(x=[1,9],y=[5,91],yerr=[4,8],color="#264b69",cap_size=2 mm)chart=page.add(p,offset=(6 mm,8 mm))page.add(text(content="Independent gaps on three vertical axes",font_family="DejaVu Sans",font_size=10 pt),target=chart.plot_top_left,offset=(0 mm,-14 mm))page.add(legend(layers=[a,b,c],columns=3,gap=3 mm,background="none"),target=chart.plot_bottom_left,offset=(0 mm,23 mm))# This data anchor uses temperature values, including its independent break.page.add(text(content="T",font_family="DejaVu Sans",font_size=8 pt,color="#a04725"),anchor=bottom_left,target=chart.data(x=9,y=910,y_axis="temperature"),offset=(2 mm,-2 mm))# END DEMO预览
依赖文件
examples/plot/multi-axes-breaks.lay
常见错误与限制#
不会自动为同侧多个轴留出间距。断轴区间必须在显式范围内递增且不重叠;segment_lengths 加间隙必须等于数据区边长,不会自动缩放。
逐项功能说明#
plot-add_axis#
给尚未放置图表添加唯一命名的轴。side 决定方向与位置,图层用 x_axis/y_axis 选择此轴;同侧间距需显式 offset。
返回:axis
必需输入:name, side, axis.
详细行为与补充示例#
参数#
| 参数 | 用途 | 默认或要求 |
|---|---|---|
x_axis / y_axis |
图层绑定轴 | x / y |
break_gap |
断口物理间距 | 2 mm |
segment_lengths |
可见段物理长度 | 省略时按变换后跨度分配 |
常见用法#
x/y 是主轴名称。每个新名称须非空且唯一;side="left|right|top|bottom",默认 right。offset=0 mm 从绘图区对应边向外量,允许负值。同侧多轴不会自动推开;根据文字宽度自行留空间。每个图层都接受 x_axis/y_axis,默认 x/y;方向不匹配或名称不存在时报错。自动范围只统计绑定该轴的数据,未使用的轴应给出显式 range。
chart.data(...) 使用原始数值,遵循所选轴的变换、反向和分段。chart.axis(name=...,anchor="start|center|end") 的 start/end 对应范围最小/最大值;reverse 不改变这个含义,center 是轴的物理中点,可能位于断口。两类锚点都随实例旋转、所在组缩放。page.add 的 offset 在页面坐标中,group.add 的 offset 在组坐标中。
| 轴参数 | 规则 |
|---|---|
reverse=false |
翻转显示方向,不修改数据或统计结果 |
scale="symlog", constant=1 |
使用 sign(x) × log(1+abs(x)/constant);constant 是正的原始数据单位数值,支持负数和零 |
tick_text=[...] |
与显式 ticks 等长;字符串、text(...)、formula(...),输入顺序保留 |
tick_rotation=0 deg |
围绕刻度文字中心旋转;先测量旋转后的边界,再定位 |
tick_offset=(0 mm,0 mm) |
图表局部坐标中的文字位移,x 向右、y 向下 |
tick_font_size=..., tick_color="#..." |
刻度文字及倍率的独立样式;刻度杆也使用 tick_color,素材明确指定的文字/公式样式保留 |
line_color="#...", line_width=... |
该轴的线条、默认文字颜色和线宽;tick_color 可单独覆盖刻度颜色 |
spine=false |
隐藏该轴轴线及断口符号,保留刻度与标签 |
minor_ticks="auto" |
显式启用自动次刻度;线性/对称对数显示的数值刻度区间五等分,对数轴生成每个十进制数量级的 2–9 次刻度;原默认仍为 [] |
| `grid="none | major |
标题、倍率的 label_offset/exponent_offset 继续独立生效。显示顺序、轴名和类别不是自动推断的;分类图请明确给出数值位置及 tick_text。
breaks 隐藏开区间,边界值仍显示;必须递增、不重叠且严格位于显式 range 内。break_gap 默认 2 mm,可为统一长度或与断口数等长的物理长度列表,均须为正。break_mark_size 控制每个斜线符号的横纵外框尺寸。
省略 segment_lengths 时,先扣除全部断口间距,再按各可见段经过轴变换后的跨度分配剩余长度。显式段长必须为正、数量为断口数加一,且段长与间距之和等于绘图区对应边长,容差 1e-6 mm。不匹配报错,不缩放用户指定的长度;精确分段建议同时指定 plot_area。
每个图层按自己绑定的两条轴建立可见区间组合并裁剪。其他轴可以具有不同的断区、断口位置、段长,或完全不断轴。折线、误差棒、柱、填充和热图均在各窗口中绘制;裁剪边界不新增误差端帽,也没有覆盖其他图层的白带。落在隐藏区间的显式刻度不绘制;落在隐藏区间的数据锚点报错。
检查输出含绘图区、各轴数据范围与变换、可见段及长度、断口及宽度、装饰边界,单位均为局部 mm。page_transform=[a,b,c,d,e,f] 将局部坐标映射到页面:X=a*x+c*y+e,Y=b*x+d*y+f,包括图表旋转与上层组缩放。

