如何用Matplotlib的fill_between填充两条相交直线的4个区域?
用Matplotlib填充两条直线划分的4个区域(含区域2和4)
两条直线方程:
y=3x-4 y=-x+5
它们相交后在平面内形成4个区域,对应数学不等式如下:
- Region1:
y<3x-4且y>-x+5 - Region2:
y>3x-4且y>-x+5 - Region3:
y>3x-4且y<-x+5 - Region4:
y<3x-4且y<-x+5
想要独立填充所有这些区域,但使用plt.fill_between时仅能填充区域1和/或3,如何填充区域2和4?
用户尝试填充区域3的代码:
import matplotlib.pyplot as plt import numpy as np x = np.arange(0,6,0.1) y = np.arange(0,6,0.1) # 待绘制的直线 y1 = 3*x - 4 y2 = -x+5 # 两条直线的较小值(区域3的上边界) y3 = np.minimum(y1, y2) # 设置坐标轴范围,隐藏负数值 plt.ylim(0, 6) plt.xlim(0, 6) # 绘制直线 plt.plot(x, y1, x, y2) # 填充区域3 plt.fill_between(x, y2, y3, color='grey', alpha=0.5) plt.show()
解决方案:结合坐标轴边界填充无界区域
区域2和4属于“半无界”区域,需要结合坐标轴的上下限来定义填充范围:
先计算两条直线的交点坐标:
解方程3x-4 = -x+5,得交点为(2.25, 2.75)。填充逻辑:
- 区域2:取两条直线的较大值作为下界,坐标轴上限(这里是6)作为上界,仅在两条直线都在坐标轴范围内的区域填充。
- 区域4:取两条直线的较小值作为上界,坐标轴下限(这里是0)作为下界,仅在两条直线都在坐标轴范围内的区域填充。
- 区域1和3:按原有逻辑填充即可。
完整代码示例:
import matplotlib.pyplot as plt import numpy as np x = np.arange(0, 6, 0.1) y1 = 3 * x - 4 y2 = -x + 5 # 计算两条直线的最大/最小值 y_max = np.maximum(y1, y2) y_min = np.minimum(y1, y2) # 设置坐标轴范围 plt.xlim(0, 6) plt.ylim(0, 6) # 绘制两条直线 plt.plot(x, y1, 'k-', label='y=3x-4') plt.plot(x, y2, 'k--', label='y=-x+5') # 填充区域1:y在y2和y1之间(仅当y2 < y < y1的部分) plt.fill_between(x, y2, y1, where=(y1 > y2), color='blue', alpha=0.3, label='Region1') # 填充区域2:y在y_max到坐标轴上限之间 plt.fill_between(x, y_max, 6, color='red', alpha=0.3, label='Region2') # 填充区域3:y在y_min和y2之间(仅当y_min < y < y2的部分) plt.fill_between(x, y_min, y2, where=(y2 > y1), color='green', alpha=0.3, label='Region3') # 填充区域4:y在坐标轴下限到y_min之间 plt.fill_between(x, 0, y_min, color='yellow', alpha=0.3, label='Region4') plt.legend() plt.show()
关键说明
- 使用
where参数可以精准筛选出符合不等式的x范围,避免填充无效区域(比如直线超出坐标轴的部分)。 - 对于无界区域,直接用坐标轴的上下限作为填充的边界,配合
np.maximum/np.minimum获取两条直线的边界值,就能实现区域2和4的填充。
内容的提问来源于stack exchange,提问作者Optical_flow_lover
相关产品推荐
相关产品推荐

