Octave中x轴用极小步长时,窗口缩放后轴范围丢失的解决方法
问题背景
使用Octave 7.1.0(8.2.0版本结果一致),尝试用pcolor()绘制密度图、bar()绘制柱状图,希望轴范围采用代码预先计算的值。初始显示时两个绘图的轴范围均正确,但放大或调整窗口大小后,原轴缩放范围丢失。已定位问题出在x向量的步长上。
问题复现
运行以下代码,通过注释/取消注释t向量的定义可复现该行为:
clc clear all close all n = 200; bins = peaks(n); t = [0:1e-11:(n-1)*1e-11]; % 此向量会引发问题 %t = [0:1e-10:(n-1)*1e-10]; % 此向量可正常工作 timeAxis = [t(50) t(end-50)]; figure plot(t, bins(:,50)) axis manual xlim(timeAxis) hold off
窗口全屏前后绘图范围会异常变化,且Octave未抛出任何警告或错误。
解决方法
方法1:显式锁定坐标轴范围模式
直接对坐标轴对象设置XLimMode为'manual',替代axis manual + xlim()的组合,避免浮点数精度问题导致的范围重置:
clc clear all close all n = 200; bins = peaks(n); t = [0:1e-11:(n-1)*1e-11]; timeAxis = [t(50) t(end-50)]; figure plot(t, bins(:,50)) % 获取当前坐标轴并设置属性 ax = gca; set(ax, 'XLim', timeAxis, 'XLimMode', 'manual'); hold off
方法2:数值缩放规避极小步长
将t向量缩放为整数步长,绘图后再修改轴标签显示原始数值,彻底避免浮点数精度问题:
clc clear all close all n = 200; bins = peaks(n); scale_factor = 1e11; t_scaled = 0:(n-1); % 整数步长无精度问题 timeAxis_scaled = [t_scaled(50) t_scaled(end-50)]; figure plot(t_scaled, bins(:,50)) axis manual xlim(timeAxis_scaled) % 将刻度标签转换回原始数值 xticks(get(gca, 'XTick')); xticklabels(get(gca, 'XTick') * 1e-11); hold off
方法3:使用axis tight manual强制锁定
在设置xlim后执行axis tight manual,强制Octave严格保持当前轴范围,不受窗口调整影响:
clc clear all close all n = 200; bins = peaks(n); t = [0:1e-11:(n-1)*1e-11]; timeAxis = [t(50) t(end-50)]; figure plot(t, bins(:,50)) xlim(timeAxis) axis tight manual hold off
内容的提问来源于stack exchange,提问作者mouelle
相关产品推荐
相关产品推荐

