给定直线参数在二维散点数据上绘制直线(Python)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_25847123/article/details/90340526

声明: 仅个人小记
前言:遇到在二维散点图上绘制指定的直线,直线不是通过直接给出两个断点而是只给了直线的必要参数,进而需要基于散点数据计算出直线的两个端点,然后绘制出直线。方便以后使用,计算端点过程记录在这里。

一、效果展示

一批散点已经绘制
基于这批散点绘制直线 (只告知直线的斜率以及截距这些参数)

二、条件交代

前提
  1. 一堆散点数据
  2. 穿过这些散点数据的一条直线wx+b=0wx+b=0其中wwbb是已知参数。
目标

将直线绘制在这批散点上

解决方案

在散点数据中,分别找出最小的x值,最大的x值,最小的y值,最大的y值这四个数据,然后带入直线,分别计算出对应的y或者x值,同时判断计算出的y或者x值是否仍然在散点图范围中,如果在则保留,否则丢弃并计算下一个,最终必然得到2个有效端点,根据这两个端点,直接在散点图上绘出直线。

三、代码实现
import numpy as np
import matplotlib.pyplot as plt

def drawScatterPointsAndLine(dataSet, labels,w,b): # draw some points and a line
    fig = plt.figure()
    ax = fig.add_subplot(111)
    # 显然,下面循环中,默认dataSet是按类别顺序整理好的数据集
    # 类别顺序参看 https://blog.csdn.net/qq_25847123/article/details/90340118
    for i in range(1,len(dataSet))# 找出两类数据分界线
        if labels[i] != labels[i-1]:
            pos = i
            break
    ax.scatter(dataSet[0:pos,0],dataSet[0:pos,1],c='k',marker='o')
    ax.scatter(dataSet[pos:len(dataSet),0],dataSet[pos:len(dataSet),1],c='b',marker='*')

    m = dataSet.min(0)# 得到最小的x,y值
    M = dataSet.max(0)#得到最大的x,y值

    #下面对4个值挨个带入直线方程进行计算
    t = -(w[0]*m[0]+b)/w[1] 
    points = np.zeros((2,2)) # 每一行向量代表一个数据点
    i = 0# 当出现有两个有效点时就计算完毕了,否则继续计算
    if t >= m[1] and t <= M[1]: 
        points[i] = np.array([m[0], t])
        i += 1
    t = -(w[0]*M[0]+b)/w[1]
    if t >= m[1] and t <= M[1]:
        points[i] = np.array([M[0],t])
        i += 1
    if i != 2:
        t = -(w[1]*m[1]+b)/w[0]
        if t > m[0] and t < M[0]:
            points[i] = np.array([t,m[1]])
            i += 1
    if i != 2:
        t = -(w[1]*M[1]+b)/w[0]
        if t > m[0] and t < M[0]:
            points[i] = np.array([t,M[1]])
    
    # 绘制直线用法,第一个参数放的是所有的x轴坐标,第二参数则是对应于x坐标的所有y坐标
    ax.plot(points[:,0],points[:,1])
    plt.show()
    
    return
展开阅读全文

没有更多推荐了,返回首页