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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:23:23