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

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

一、效果展示
一批散点已经绘制
基于这批散点绘制直线 (只告知直线的斜率以及截距这些参数)
二、条件交代
前提
  1. 一堆散点数据
  2. 穿过这些散点数据的一条直线 w x + b = 0 wx+b=0 wx+b=0其中 w w w b b b是已知参数。
目标

将直线绘制在这批散点上

解决方案

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

三、代码实现
dataSet = np.array([[3,7],[6,4],[5,6],[5,3],[4,8],[7,2],[8,5]]) # 原始数据
labels  = np.array([0,1,0,1,0,1,1])
w= [1,2]
b = 2.5
import numpy as np
import matplotlib.pyplot as plt

def drawScatterPointsAndLine(dataSet, labels,w,b): # draw some points and a line
# wx+b=0
    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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值