MATLAB中fill函数填充batha曲线下方区域失败,求解决方案
解决MATLAB中填充曲线下方区域的问题
问题分析
你当前的代码错误在于没有构造出闭合的填充多边形,fill函数需要完整的闭合路径才能正确填充区域。你之前的两次fill调用分别构造了不完整的路径,导致填充效果不符合预期。
正确解决方案
方法1:使用fill构造闭合多边形
要填充曲线batha下方(到曲线最低点)的区域,需要构造包含曲线所有点、并沿底部闭合的多边形顶点:
batha = [7.1333, 7.2417, 8.9061, 11.3646, 12.4889, 13.4572, 14.2250, 14.9386, 15.6905, 16.3310, 16.9292, 17.5558, 18.1131, 18.6633, 19.1629, 19.6635, 20.1515, 20.5933, 21.0977, 21.5496, 21.9330, 22.2395, 22.5265, 22.7585, 23.1206, 23.4995, 23.9305, 24.2578, 24.6371, 25.1523, 25.4367, 25.6555, 25.9033, 26.1234, 26.2947, 26.4327, 26.5938, 26.6785, 26.7185, 26.7620, 26.8082, 26.7954, 26.7736, 26.7620, 26.7115, 26.5621, 26.3871, 26.1397, 25.9179, 25.6900, 25.4573, 25.1153, 24.7805, 24.4380, 24.0568, 23.7017, 23.3502, 22.9135, 22.5052, 22.0068, 21.4806, 21.0029, 20.5206, 20.0435, 19.5195, 18.9530, 18.4100, 17.9349, 17.4666, 17.0207, 16.5991, 16.1766, 15.8215, 15.6079, 15.4509, 15.2146, 14.9472, 14.7120, 14.3792, 14.0351, 13.7436, 13.4690, 13.1548, 12.9656, 12.8458, 12.6870, 12.5101, 12.2376, 11.8062, 11.3752, 10.9464, 10.4963, 10.0391, 9.5816, 9.1367, 8.7270, 8.2709, 7.7497, 7.0903, 6.1263]; bdii = [0, 0.0303, 0.0606, 0.0909, 0.1212, 0.1515, 0.1818, 0.2121, 0.2424, 0.2727, 0.3030, 0.3333, 0.3636, 0.3939, 0.4242, 0.4545, 0.4848, 0.5152, 0.5455, 0.5758, 0.6061, 0.6364, 0.6667, 0.6970, 0.7273, 0.7576, 0.7879, 0.8182, 0.8485, 0.8788, 0.9091, 0.9394, 0.9697, 1.0000, 1.0303, 1.0606, 1.0909, 1.1212, 1.1515, 1.1818, 1.2121, 1.2424, 1.2727, 1.3030, 1.3333, 1.3636, 1.3939, 1.4242, 1.4545, 1.4848, 1.5152, 1.5455, 1.5758, 1.6061, 1.6364, 1.6667, 1.6970, 1.7273, 1.7576, 1.7879, 1.8182, 1.8485, 1.8788, 1.9091, 1.9394, 1.9697, 2.0000, 2.0303, 2.0606, 2.0909, 2.1212, 2.1515, 2.1818, 2.2121, 2.2424, 2.2727, 2.3030, 2.3333, 2.3636, 2.3939, 2.4242, 2.4545, 2.4848, 2.5152, 2.5455, 2.5758, 2.6061, 2.6364, 2.6667, 2.6970, 2.7273, 2.7576, 2.7879, 2.8182, 2.8485, 2.8788, 2.9091, 2.9394, 2.9697, 3.0000]; % 调整水深数据为负值 batha = -1.*batha; % 绘制曲线 plot(bdii, batha, 'k'); hold on; % 构造闭合填充区域的顶点 fill_x = [bdii, fliplr(bdii)]; % 正向x + 反向x fill_y = [batha, repmat(min(batha), 1, length(bdii))]; % 曲线y + 底部y值(最低点) % 填充区域 fill(fill_x, fill_y, 'g');
方法2:使用area函数(更简洁)
area函数可以直接填充曲线到指定基准值之间的区域,只需设置BaseValue参数为填充的下限(这里用曲线的最小值):
batha = [7.1333, 7.2417, 8.9061, 11.3646, 12.4889, 13.4572, 14.2250, 14.9386, 15.6905, 16.3310, 16.9292, 17.5558, 18.1131, 18.6633, 19.1629, 19.6635, 20.1515, 20.5933, 21.0977, 21.5496, 21.9330, 22.2395, 22.5265, 22.7585, 23.1206, 23.4995, 23.9305, 24.2578, 24.6371, 25.1523, 25.4367, 25.6555, 25.9033, 26.1234, 26.2947, 26.4327, 26.5938, 26.6785, 26.7185, 26.7620, 26.8082, 26.7954, 26.7736, 26.7620, 26.7115, 26.5621, 26.3871, 26.1397, 25.9179, 25.6900, 25.4573, 25.1153, 24.7805, 24.4380, 24.0568, 23.7017, 23.3502, 22.9135, 22.5052, 22.0068, 21.4806, 21.0029, 20.5206, 20.0435, 19.5195, 18.9530, 18.4100, 17.9349, 17.4666, 17.0207, 16.5991, 16.1766, 15.8215, 15.6079, 15.4509, 15.2146, 14.9472, 14.7120, 14.3792, 14.0351, 13.7436, 13.4690, 13.1548, 12.9656, 12.8458, 12.6870, 12.5101, 12.2376, 11.8062, 11.3752, 10.9464, 10.4963, 10.0391, 9.5816, 9.1367, 8.7270, 8.2709, 7.7497, 7.0903, 6.1263]; bdii = [0, 0.0303, 0.0606, 0.0909, 0.1212, 0.1515, 0.1818, 0.2121, 0.2424, 0.2727, 0.3030, 0.3333, 0.3636, 0.3939, 0.4242, 0.4545, 0.4848, 0.5152, 0.5455, 0.5758, 0.6061, 0.6364, 0.6667, 0.6970, 0.7273, 0.7576, 0.7879, 0.8182, 0.8485, 0.8788, 0.9091, 0.9394, 0.9697, 1.0000, 1.0303, 1.0606, 1.0909, 1.1212, 1.1515, 1.1818, 1.2121, 1.2424, 1.2727, 1.3030, 1.3333, 1.3636, 1.3939, 1.4242, 1.4545, 1.4848, 1.5152, 1.5455, 1.5758, 1.6061, 1.6364, 1.6667, 1.6970, 1.7273, 1.7576, 1.7879, 1.8182, 1.8485, 1.8788, 1.9091, 1.9394, 1.9697, 2.0000, 2.0303, 2.0606, 2.0909, 2.1212, 2.1515, 2.1818, 2.2121, 2.2424, 2.2727, 2.3030, 2.3333, 2.3636, 2.3939, 2.4242, 2.4545, 2.4848, 2.5152, 2.5455, 2.5758, 2.6061, 2.6364, 2.6667, 2.6970, 2.7273, 2.7576, 2.7879, 2.8182, 2.8485, 2.8788, 2.9091, 2.9394, 2.9697, 3.0000]; % 调整水深数据为负值 batha = -1.*batha; % 使用area函数填充曲线到最低点的区域 area(bdii, batha, 'BaseValue', min(batha), 'FaceColor', 'g'); hold on; % 叠加绘制原始曲线 plot(bdii, batha, 'k');
说明
- 两种方法都能实现曲线下方区域的填充,
area函数更简洁,fill则更灵活,可自定义填充的边界。 - 如果需要填充到y=0(而非曲线最低点),只需把
min(batha)替换为0即可。
内容的提问来源于stack exchange,提问作者Pedro
相关产品推荐
相关产品推荐

