绘制平面图
绘制 房价 与 房价面积 及 房间数量 之间关系的散点图
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# 第一步:加载样本数据
# x1 是商品房面积
x1 = np.array([137.97, 104.50, 100.00, 124.32, 79.20, 99.00, 124.00, 114.00,
106.69, 138.05, 53.75, 46.91, 68.00, 63.02, 81.26, 86.21])
# x2 是商品房房间数
x2 = np.array([3, 2, 2, 3, 1, 2, 3, 2,
2, 3, 1, 1, 1, 1, 2, 2])
# y 是房价
y = np.array([145.00, 110.00, 93.00, 116.00, 65.32, 104.00, 118.00, 91.00,
62.00, 133.00, 51.00, 45.00, 78.50, 69.65, 75.69, 95.30])
# 创建Figure对象
fig = plt.figure(figsize=(8, 6))
# 创建3D对象
ax3d = Axes3D(fig)
# 绘制散点图
# 指定x、y、z坐标,并用蓝色的‘*’标记
ax3d.scatter(x1, x2, y, c='b', marker='*')
# 这里也可以使用plt中的设置标签的方法来进行设置
ax3d.set_xlabel('Area', color='r', fontsize=16)
ax3d.set_ylabel('Room', color='r', fontsize=16)
ax3d.set_zlabel('Price', color='r', fontsize=16)
# 设置y轴的坐标轴刻度, 这里的y轴对应我们的房间数
# 因为房间数最大数是3, 所以这里将刻度设置为整数1、2、3
# 要注意的是这个函数是设置坐标轴上刻度的显示方式, 而不是设置坐标轴范围
ax3d.set_yticks([1, 2, 3])
# set_zlim3d是设置坐标轴的范围,将 z 轴的范围设置为30-160之间
ax3d.set_zlim3d(30, 160)
# 将创建好的3D对象显示出来
plt.show()
这是运行结果: 除此之外,还可以使用
view_init(elev,azim)
来改变视角,其中,参数 elev 表示视角的水平高度,第二个参数表示水平旋转的角度。
将上面的程序中添加代码:
# 创建3D对象
...
ax3d.view_init(elev=0, azim=-90)
...
运行如下: 再换个角度:
# 创建3D对象
...
ax3d.view_init(elev=0, azim=0)
...
因为第一个图是三维图,左右两边存在一定的角度。所以两边的点好像没有完全落在坐标1和3上,这是视觉的偏差。
绘制平面图
绘制 房价 与 房价面积 及 房间数量 之间关系的平面图。
下面,来绘制平面图。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# x1 是商品房面积
x1 = np.array([137.97, 104.50, 100.00, 124.32, 79.20, 99.00, 124.00, 114.00,
106.69, 138.05, 53.75, 46.91, 68.00, 63.02, 81.26, 86.21])
# x2 是商品房房间数
x2 = np.array([3, 2, 2, 3, 1, 2, 3, 2,
2, 3, 1, 1, 1, 1, 2, 2])
# 生成网格点的坐标矩阵
X1, X2 = np.meshgrid(x1, x2)
W = np.array([11.96729093, 0.53488599, 14.33150378])
# 使用模型估计出房价
Y_PRED = W[1] * X1 + W[2] * X2 + W[0]
# 创建Figure对象
fig = plt.figure()
# 创建3D对象
ax3d = Axes3D(fig)
# 绘制平面图
ax3d.plot_surface(X1, X2, Y_PRED, cmap='coolwarm')
# 这里也可以使用plt中的设置标签的方法来进行设置
ax3d.set_xlabel('Area', color='r', fontsize=16)
ax3d.set_ylabel('Room', color='r', fontsize=16)
ax3d.set_zlabel('Price', color='r', fontsize=16)
# 设置y轴的坐标轴刻度, 这里的y轴对应我们的房间数
# 因为房间数最大数是3, 所以这里将刻度设置为整数1、2、3
# 要注意的是这个函数是设置坐标轴上刻度的显示方式, 而不是设置坐标轴范围
ax3d.set_yticks([1, 2, 3])
# 将创建好的3D对象显示出来
plt.show()
运行结果如下: 在房间数这个轴上,样本中的数字只有1、2、3,因此只有两格。而在面积这个轴上,样本的分布是不均匀的。因此,图中这些网格的划分也是不均匀的。
绘制线框图、预测房价和实际房价
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']
# x1 是商品房面积
x1 = np.array([137.97, 104.50, 100.00, 124.32, 79.20, 99.00, 124.00, 114.00,
106.69, 138.05, 53.75, 46.91, 68.00, 63.02, 81.26, 86.21])
# x2 是商品房房间数
x2 = np.array([3, 2, 2, 3, 1, 2, 3, 2,
2, 3, 1, 1, 1, 1, 2, 2])
# y 是房价
y = np.array([145.00, 110.00, 93.00, 116.00, 65.32, 104.00, 118.00, 91.00,
62.00, 133.00, 51.00, 45.00, 78.50, 69.65, 75.69, 95.30])
# 生成网格点的坐标矩阵
X1, X2 = np.meshgrid(x1, x2)
W = np.array([11.96729093, 0.53488599, 14.33150378])
# 使用模型估计出的房价
y_pred = W[1] * x1 + W[2] * x2 + W[0]
Y_PRED = W[1] * X1 + W[2] * X2 + W[0]
# 创建Figure对象
fig = plt.figure()
# 创建3D对象
ax3d = Axes3D(fig)
# 绘制散点图
# 指定x、y、z坐标,并用蓝色的‘*’标记
ax3d.scatter(x1, x2, y, c='b', marker='*', label="销售记录")
ax3d.scatter(x1, x2, y_pred, c='r', label="预测房价")
ax3d.plot_wireframe(X1, X2, Y_PRED, color="c", linewidth=0.5, label="拟合平面")
# 这里也可以使用plt中的设置标签的方法来进行设置
ax3d.set_xlabel('Area', color='r', fontsize=14)
ax3d.set_ylabel('Room', color='r', fontsize=14)
ax3d.set_zlabel('Price', color='r', fontsize=14)
# 设置y轴的坐标轴刻度, 这里的y轴对应我们的房间数
# 因为房间数最大数是3, 所以这里将刻度设置为整数1、2、3
# 要注意的是这个函数是设置坐标轴上刻度的显示方式, 而不是设置坐标轴范围
ax3d.set_yticks([1, 2, 3])
plt.suptitle("商品房销售回归模型", fontsize=20)
plt.legend(loc="upper left")
# 将创建好的3D对象显示出来
plt.show()
运行代码如下: 这些红色的点就是预测出来的房价,它们既在线框图的网格点上,也在平面图上。这些蓝色的点是实际的房价,它们与预测出来的房价之间存在一定的偏差。
|