rrdtool如何正确显示双数值并配置大小适配的Y轴刻度
结论
该需求可以正常实现,你之前的问题是搞错了--right-axis参数的作用:这个参数只会修改右侧Y轴的刻度文字,不会对参与绘图的数值做任何缩放,所以才会出现小范围数值被大范围数值挤压到0刻度线附近的问题。
具体实现方法
核心逻辑是:先手动把右轴对应的数据集缩放到和左轴数据集相同的数值区间,再用--right-axis参数把右轴刻度反向换算回原始数值范围即可。
针对你给出的数值范围:左轴数据0-70,右轴数据0-800,操作步骤如下:
- 计算缩放系数
要让两组数据的绘图高度对齐,右轴原始值800对应左轴最大值70,因此右轴数据的绘图缩放系数为70/800 = 0.0875;反向还原刻度的系数为其倒数800/70 ≈ 11.4286。 - 用CDEF生成缩放后的右轴绘图数据
不要直接用右轴原始DEF数据绘图,通过CDEF完成数值缩放:# 定义左轴数据集(0-70范围) DEF:data_left=your_data.rrd:ds_left:AVERAGE # 定义右轴原始数据集(0-800范围) DEF:data_right_raw=your_data.rrd:ds_right:AVERAGE # 生成缩放后适配左轴绘图区间的右轴数据 CDEF:data_right_scaled=data_right_raw,0.0875,* - 配置双Y轴参数
右轴参数使用反向还原的系数,偏移量为0:--left-axis-label="第一组数据(0-70)" --right-axis-label="第二组数据(0-800)" --right-axis=11.4286:0 # 可选:配置两侧轴的数值显示格式 --left-axis-format="%1.0f" --right-axis-format="%1.0f" - 调用绘图指令
左轴图形用原始左轴数据绘制,右轴图形用缩放后的右轴数据绘制:LINE2:data_left#c0392b:"第一组数值" LINE2:data_right_scaled#2980b9:"第二组数值"
效果验证
当第二组数值为500时,缩放后的绘图值为500*0.0875=43.75,对应左轴43.75的高度位置;第一组数值为10时,绘图位置在左轴10的高度,两者完全不会重叠贴线,右侧轴对应位置会正确标注500的刻度值,和实际数值匹配。
注意事项
- 两个缩放系数不要搞反:CDEF是把右轴原始值缩到左轴的绘图区间,
--right-axis是把绘图值反算成右轴原始刻度,二者互为倒数 - 如果你的数据包含负数区间,需要同步调整
--right-axis的偏移量参数,保证0基线对齐 - 不要依赖
--right-axis做数值缩放,这个参数从设计上就只处理刻度标注,不碰实际绘图数据
内容的提问来源于stack exchange,提问作者Sven Kavon
相关产品推荐
相关产品推荐

