Matlab中bar图xlim设置与plot不一致,调整时影响y轴求助
解决Matlab中bar图设置xlim时y轴受影响的问题
这个问题我之前也碰到过!核心原因是Matlab的bar函数和plot函数处理日期型x轴的逻辑完全不同:
plot会直接把日期数组当作数值型数据(底层是日期序列号)来绘制,x轴的范围和刻度都对应实际的日期数值,所以用xlim([dates(5), dates(10)])能精准控制日期范围,不会影响y轴。- 但
bar函数默认会把输入的x轴数据当作类别型数据——哪怕你传的是日期数组,它也会自动给每个柱子分配从1开始的索引位置(比如第1个柱子在x=1,第2个在x=2...),这时候你用日期数值去设置xlim,相当于把x轴范围拉到了日期序列号的量级(比如2023年的日期序列号大概是739000左右),所有柱子都会挤在x轴的最左端,视觉上就会让y轴看起来被“压缩”或者异常。
给你两种靠谱的解决方案:
方案1:直接用柱子的索引设置xlim(最简单)
既然bar的x轴底层是索引,直接用索引范围来限制显示的柱子即可:
% 绘制bar图 h = bar(dates, y); % 设置x轴为日期刻度 datetick('x', 'yyyy-mm-dd'); % 限制显示第5到第10个柱子(对应dates(5)到dates(10)的日期) xlim([5, 10]);
方案2:基于日期序列号设置xlim(适合需要严格对应日期数值的场景)
如果必须用日期的实际数值来控制范围,可以先把日期转为序列号,再传给bar:
% 将日期数组转为Matlab内部的日期序列号 date_nums = datenum(dates); % 用序列号绘制bar图 h = bar(date_nums, y); % 设置x轴为日期刻度 datetick('x', 'yyyy-mm-dd'); % 用日期序列号设置x轴范围 xlim([date_nums(5), date_nums(10)]);
验证小技巧
你可以在设置xlim前后用get(gca, 'XLim')查看当前x轴范围,就能明白问题所在:
- 默认情况下,bar图的xlim是
[0.5, length(dates)+0.5],对应每个柱子的中心位置 - 如果直接用
dates(5)设置xlim,得到的会是[73xxxx, 73xxxx]这样的大数值范围,柱子自然会挤在一起
内容的提问来源于stack exchange,提问作者WJA
相关产品推荐
相关产品推荐

