如何筛选matplotlib图表中指定斜线下的所有数据点?
解决斜线区域数据点着色问题
要给斜线下的点设置不同颜色,核心是先明确斜线的数学方程,再根据点的坐标判断是否落在目标区域。以下是针对你示例代码的完整解决方案:
步骤说明
- 转换数据类型:将元组形式的x、y转为numpy数组,支持布尔索引操作(和你之前处理矩形区域的逻辑一致);
- 推导斜线方程:示例中的斜线经过
(6,9)和(11,16),用两点式推导方程为:
简化后是y = (7/5)*(x - 6) + 9y = 1.4x + 0.6,两种形式都可以用来判断点的位置; - 构建区域过滤条件:结合左侧的水平线
y=9(x≤6的区域)和斜线(x>6的区域),组合出斜线下区域的判断条件; - 分区域着色:分别绘制符合条件的点和剩余点,设置不同颜色。
完整代码
import matplotlib.pyplot as plt import numpy as np # 转换为numpy数组,支持布尔索引 x = np.array((6, 4, 10, 7, 11, 9, 7.5, 4.5, 6.5)) y = np.array((10, 7, 13, 10, 9, 10, 11.5, 8.6, 14)) # 推导斜线方程:经过(6,9)和(11,16) def line_eq(x_val): return (7/5)*(x_val - 6) + 9 # 构建斜线下区域的过滤条件 # x≤6时,y < 9;x>6时,y < 斜线对应的y值 below_filter = ((x <= 6) & (y < 9)) | ((x > 6) & (y < line_eq(x))) # 绘制斜线下的点(比如设为红色) plt.scatter(x[below_filter], y[below_filter], color='red', label='斜线下方') # 绘制剩余的点(默认蓝色) plt.scatter(x[~below_filter], y[~below_filter], color='blue', label='斜线及上方') # 绘制原有的辅助线 plt.axhline(y=9, xmax=.3, color='black', linestyle='--') x_1, y_1 = [6, 11], [9, 16] plt.plot(x_1, y_1, linestyle='--', c='black') plt.legend() plt.show()
关键细节
- 如果你实际数据中的斜线参数不同,只需要修改
line_eq函数里的方程即可; - 布尔索引的逻辑和你之前处理
(x < 4) & (y > 28.81)的思路一致,只是把矩形区域的判断换成了斜线的分段判断; - 直接使用布尔数组组合条件即可,无需额外封装,逻辑更直观。
内容的提问来源于stack exchange,提问作者Jessica Berkheimer
相关产品推荐
相关产品推荐

