首页 > 其他分享 >【MATLAB】自学记录之基于某楼栋房价数据绘制三维网格图

【MATLAB】自学记录之基于某楼栋房价数据绘制三维网格图

时间:2025-01-15 20:43:00浏览次数:1  
标签:room priceData floor 某楼栋 户型 网格 楼层 MATLAB itp

1. 前言

基于某小区某一楼栋各个户型及楼层之间对应的出售价格表,通过MATLAB脚本进行读取解析,并绘制成三维网格图,从而能够直观地以可视化的角度观察户型位置(东边户、西边户、中间连廊户)、楼层位置(高中低楼层)等因素是否与出售价格存在一定的影响关系。


2. 预置条件

序号 配置项 说明
1 某楼栋出售价格表 存储了各楼层及各户型对应的房价数据文件,以xlsx或txt格式进行存储
2 MATLAB 2023b

3. 步骤记录

  1. 将文件放置在当前文件夹下,与MATLAB代码文件保持同一层级,文件内容示例如下。

某楼栋房价示例数据文件

  1. 使用readtable函数读取xlsx文件,或用load命令直接加载txt文件。此时priceData变量的数据类型是30*4的double类型的二维矩阵。

    设定该楼栋为4户型30层。

    % 读取xlsx文件,并转换成double类型的二维矩阵
    priceData = table2array(readtable('priceData.xlsx'));
    % 读取txt文件,MATLAB将自动以文件名作为变量名称,存储文件中的数据
    load priceData.txt;
    
  2. 根据priceData矩阵的维度,分别生成户型行向量和楼层行向量。

    priceData矩阵存储的数据中,行数为楼层,列数为户型。

    rooms = 1:size(data, 2);
    floors = 1:size(data, 1);
    
  3. 对户型和楼层生成二维网格矩阵,此时rooms和floors矩阵的维度均变成了30*4,且与priceData矩阵保持一致。

    [room_1, floor_1] = meshgrid(rooms, floors);
    
  4. 通过mesh函数绘制并渲染三维网格图,效果如下。

    三维网格图

    figure;
    mesh(rooms, floors, priceData);
    xlabel("户型");
    ylabel("楼层");
    zlabel("单价");
    grid on;
    

4. 数据插值优化

通过观察以上生成的三维网格图,可基本看出楼层、户型与价格的影响关系。如:底顶楼层的价格相对较低;其他楼层中,每隔几层楼就出现一次价格较低的楼层;同一楼层中不同户型位置价格变化不大,整体上西边户(01户)的出售价格相较于其他户型来说是偏低的。
但是,由于楼层仅有30层,相邻楼层之间的连线较为生硬,希望通过平滑曲线来展示同一户型不同楼层的价格影响趋势,这就需要将楼层以及出售价格等数据进行精细化处理,处理步骤如下。

  1. 分别对户型行向量和楼层行向量进行精细化处理,此时户型和楼层行向量的长度可通过如下公式计算。

    \[\mathit{ \left\{\begin{matrix} Len_{room\_itp} =\frac{size(rooms,2) - 1}{0.05} + 1 \\ Len_{floor\_itp} =\frac{size(floors,2) - 1}{0.05} + 1 \end{matrix}\right.} \]

    room_itp = 1:0.05:size(rooms,2);
    floor_itp = 1:0.05:size(floors, 2);
    
  2. 对户型和楼层重新生成二维网格矩阵,大小为\(Len_{floor\_itp}\times Len_{room\_itp}\)

    [room_1, floor_1] = meshgrid(room_itp, floor_itp);
    
  3. 再利用MATLAB中的interp2函数,对出售价格进行插值计算。

    其中,插值方式采用cubic(三次插值)方法。

    prices = interp2(rooms, floors, priceData, room_1, floor_1, 'cubic');
    
  4. 再次通过mesh函数绘制并渲染三维网格图,效果如下。

三维网格图-插值处理后

figure;
mesh(room_1, floor_1, prices);

xlabel("户型");
ylabel("楼层");
zlabel("单价");
grid on;

5. 完整代码

clc;clear;
file = './priceData.xlsx';

priceData = table2array(readtable(file));

rooms = 1:size(priceData, 2);
floors = 1:size(priceData, 1);

% 对户型、楼层做插值
room_itp = 1:0.05:size(rooms,2);
floor_itp = 1:0.05:size(floors, 2);

[room_1, floor_1] = meshgrid(room_itp, floor_itp);

prices = interp2(rooms, floors, priceData, room_1, floor_1, 'cubic');
figure;
mesh(room_1, floor_1, prices);

xlabel("户型");
ylabel("楼层");
zlabel("单价");
grid on;

标签:room,priceData,floor,某楼栋,户型,网格,楼层,MATLAB,itp
From: https://www.cnblogs.com/fantasyboyce/p/18673693

相关文章