声明: 仅个人小记
前言:遇到在二维散点图上绘制指定的直线,直线不是通过直接给出两个断点而是只给了直线的必要参数,进而需要基于散点数据计算出直线的两个端点,然后绘制出直线。方便以后使用,计算端点过程记录在这里。
一、效果展示
一批散点已经绘制
基于这批散点绘制直线 (只告知直线的斜率以及截距这些参数)
二、条件交代
前提
- 一堆散点数据
- 穿过这些散点数据的一条直线 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