如何获取matplotlib中已绘制直线的信息?get_data返回异常值
解决matplotlib中ax.get_lines()获取axline数据异常的问题
问题原因
plt.axline()绘制的是无限延伸的直线,Matplotlib内部并未存储你传入的原始两点,而是用单位区间([0, 1], [0, 1])作为基础数据,再通过坐标轴的变换矩阵将其映射到设定的坐标范围上。这就是调用get_data()总是返回固定([0, 1], [0, 1])的原因。
解决方法
方法1:直接复用原始绘制数据
既然已知绘制直线的两个点,直接保存坐标用于后续分析即可:
import numpy as np import matplotlib.pyplot as plt plt.rcParams["figure.figsize"] = [7.00, 7.00] fig = plt.figure() ax = fig.add_subplot(111) ax.set_xlim([0, 100]) ax.set_ylim([0, 100]) # 保存原始点数据 point1 = [-8,4] point2 = [10,15] plt.axline(point1, point2) # 后续分析直接使用原始点 print("原始直线数据:", point1, point2) plt.show()
方法2:从直线对象提取直线参数
如果无法直接获取原始点,可从直线对象的变换属性中计算斜率和截距,再根据坐标轴范围生成对应数据点:
import numpy as np import matplotlib.pyplot as plt plt.rcParams["figure.figsize"] = [7.00, 7.00] fig = plt.figure() ax = fig.add_subplot(111) ax.set_xlim([0, 100]) ax.set_ylim([0, 100]) point1 = [-8,4] point2 = [10,15] line = plt.axline(point1, point2) # 获取单位数据与变换矩阵 x_unit, y_unit = line.get_data() transform = line.get_transform() # 将单位数据转换为坐标轴实际点 xy_actual = transform.transform(np.column_stack([x_unit, y_unit])) x_actual, y_actual = xy_actual.T # 计算直线斜率与截距 slope = (y_actual[1] - y_actual[0]) / (x_actual[1] - x_actual[0]) intercept = y_actual[0] - slope * x_actual[0] # 根据坐标轴范围生成直线端点 x_range = ax.get_xlim() y_range = [slope * x + intercept for x in x_range] print("直线斜率:", slope) print("直线截距:", intercept) print("坐标轴范围内的直线端点:", list(zip(x_range, y_range))) plt.show()
内容的提问来源于stack exchange,提问作者ximik717
相关产品推荐
相关产品推荐

