使用Matplotlib为绘图可行区域填色:设置填充最值遇阻求助
解决Matplotlib可行区域填充的最值设置问题
嘿,太懂这种卡在填充区域设置上的闹心了!通常遇到这种问题,大概率是没捋清楚可行区域的边界逻辑,或者用错了填充函数的参数。我先给你梳理几个常见的坑,再拿个示例代码拆解下:
常见问题点
- 没明确可行区域的上下/左右边界序列:要是你要填充两条曲线之间的区域,得传对应x轴的最值序列,而不是单个固定数值
- 搞混了
fill_between的参数:比如把y1和y2的顺序弄反,或者没匹配好对应的x轴取值范围 - 忽略了多约束条件的筛选:要是可行区域是由多个不等式限制的,得先算出满足所有约束的x、y子集,再进行填充
示例修正
假设你的原始代码是这类常见错误版本:
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 10, 100) y1 = 2*x + 1 y2 = -x + 8 # 错误:用单个固定值当上限,而非对应每个x的边界序列 plt.fill_between(x, y1, 10, color='blue', alpha=0.3) plt.plot(x, y1, label='y1=2x+1') plt.plot(x, y2, label='y2=-x+8') plt.legend() plt.show()
这里的问题是你用固定值10作为上限,但实际可行区域应该是两条曲线相交前的部分(比如y1 ≤ y ≤ y2)。修正后的代码应该这样写:
import matplotlib.pyplot as plt import numpy as np x = np.linspace(0, 10, 100) y1 = 2*x + 1 y2 = -x + 8 # 先计算两条曲线的交点,锁定可行区域的x范围 intersection_x = (8 - 1) / (2 + 1) # 解方程2x+1 = -x+8 # 筛选出交点左侧的x和对应y值(这部分是满足y1 ≤ y ≤ y2的区域) x_feasible = x[x <= intersection_x] y1_feasible = y1[x <= intersection_x] y2_feasible = y2[x <= intersection_x] # 填充y1到y2之间的可行区域 plt.fill_between(x_feasible, y1_feasible, y2_feasible, color='lightblue', alpha=0.4) plt.plot(x, y1, label='y1=2x+1') plt.plot(x, y2, label='y2=-x+8') plt.xlim(0, 10) plt.ylim(0, 15) plt.legend() plt.show()
关键提示
- 如果你的可行区域是多约束(比如
x≥0、y≥0、y≤2x+1、y≤-x+8),可以用np.where筛选符合所有条件的数值:比如y_upper = np.minimum(y2, 15)来取多个上限中的最小值,作为可行区域的上边界 - 要是你用的是
fill函数填充多边形可行区域,得先把所有顶点的坐标按顺序整理好,再传入函数
要是你的代码和这个示例不一样,把具体代码贴出来,我帮你精准定位问题!
内容的提问来源于stack exchange,提问作者Gru26
相关产品推荐
相关产品推荐

