Matlab中X区间数据集绘制及omitnan失效问题排查
Matlab问题解决:NaN参数失效与区间数据无插值绘制
一、解决omitnan参数未生效的问题
你的代码里mask = ~isnan(ddcr) & (cno >= i) & (cno <= i+step)已经过滤掉了ddcr中的NaN值,所以ddcr(mask)本身就不含NaN,此时std(..., 'omitnan')自然不会起作用。
如果ddpr中也存在NaN,需要把它的NaN判断加入mask:
mask = ~isnan(ddcr) & ~isnan(ddpr) & (cno >= i) & (cno <= i+step);
如果不需要同时过滤两个变量的NaN,也可以直接去掉mask里的~isnan(ddcr),让std和median的omitnan参数真正发挥作用:
mask = (cno >= i) & (cno <= i+step); std_cr(j) = std(ddcr(mask), 'omitnan'); std_pr(j) = std(ddpr(mask), 'omitnan'); med_cr(j) = median(abs(ddcr(mask)), 'omitnan'); med_pr(j) = median(abs(ddpr(mask)), 'omitnan');
二、实现X区间数据的无插值绘制
要直接展示每个X区间(i到i+step)对应的Y值,不需要插值,最直观的方式是给每个区间画水平线段或矩形块。
方法1:绘制水平线段(推荐)
在循环内添加代码,每个区间画一条从i到i+step的水平线,Y值为当前计算的std_cr(j):
% 在j = j+1之前添加 plot([i, i+step], [std_cr(j), std_cr(j)], 'b-', 'LineWidth', 1.5); hold on; % 保持画布,继续绘制后续区间
如果需要标记区间中点(和你之前计算的x_cno(j)对应),可以同时添加散点:
scatter(x_cno(j), std_cr(j), 20, 'k', 'filled');
方法2:绘制区间矩形块
如果需要更清晰展示区间范围,可用rectangle函数绘制每个区间的矩形:
rectangle('Position', [i, std_cr(j)-0.001, step, 0.002], 'FaceColor', 'b', 'EdgeColor', 'none'); hold on;
这里的Position参数是[x左, y下, 宽度, 高度],可根据你的Y值范围调整高度和偏移量。
完整修改后的代码片段
j = 1; hold on; % 提前开启hold on,避免重复调用 for i = 50-range:step:50 mask = (cno >= i) & (cno <= i+step); % 去掉ddcr的NaN过滤,让omitnan生效 x_cno(j) = i + step/2; std_cr(j) = std(ddcr(mask), 'omitnan'); std_pr(j) = std(ddpr(mask), 'omitnan'); med_cr(j) = median(abs(ddcr(mask)), 'omitnan'); med_pr(j) = median(abs(ddpr(mask)), 'omitnan'); fprintf('%s %d %d %.3f %.3f %.3f %.3f\n',titleStr, i, i+step, std_cr(j), std_pr(j), med_cr(j), med_pr(j)); % 绘制区间水平线段 plot([i, i+step], [std_cr(j), std_cr(j)], 'b-', 'LineWidth', 1.5); % 绘制中点散点 scatter(x_cno(j), std_cr(j), 20, 'k', 'filled'); j = j + 1; end hold off; xlabel('X区间'); ylabel('Y值'); title('区间数据无插值绘制');
内容的提问来源于stack exchange,提问作者user14708750
相关产品推荐
相关产品推荐

