如何在矩阵中添加墙体并通过plt.imshow()绘制房屋平面图
房屋平面图矩阵添加墙体的解决方案
我需要用Python将房屋平面图表示为矩阵,规则为:空白区域值为0,房间值为1,墙体值为2,之后通过plt.imshow()进行绘制。现有代码可成功绘制房间部分,但无法在矩阵中添加宽度为1的墙体(即给指定坐标赋值为2),尝试的代码未生效,求解决方案。
现有代码
import numpy as np import matplotlib.pyplot as plt class Dom: def __init__(self, params): self.params = params matrices = {} self.matrices = matrices for key in params["indexes"].keys(): row_min = min([tup[0] for tup in params["indexes"][key]]) row_max = max([tup[0] for tup in params["indexes"][key]]) col_min = min([tup[1] for tup in params["indexes"][key]]) col_max = max([tup[1] for tup in params["indexes"][key]]) self.matrices[key] = np.zeros((row_max - row_min, col_max - col_min)) mask = params["mask"][key] self.matrices[key][mask == 1] = 1 mask = params["mask"][key] self.matrices[key][mask == 1] = 1 self.bigmatrix = np.zeros((100, 100)) for key in params["indexes"].keys(): row_min = min([tup[0] for tup in params["indexes"][key]]) row_max = max([tup[0] for tup in params["indexes"][key]]) col_min = min([tup[1] for tup in params["indexes"][key]]) col_max = max([tup[1] for tup in params["indexes"][key]]) self.bigmatrix[row_min:row_max, col_min:col_max] = self.matrices[key] def build(self): return self.matrices.values() def build2(self): return self.bigmatrix if __name__ == '__main__': params = {"indexes": {"I": [(0, 0), (0, 50), (50, 0), (50, 50)], "II": [(0, 50), (0, 100), (50,50), (50, 100)], "III": [(50, 0), (50, 100), (70, 0), (70, 100)], "IV": [(70, 0), (70,50), (100,0), (100,50)], "V": [(70,50), (70,100), (100,50), (100, 100)]}, "rozdzielczosc": {}, "mask": {"I": 1, "II": 0, "III": 1, "IV": 1, "V": 1}, "wall":{"I":[(0,49), (0,50), (50,49), (50,50)]}} dom = Dom(params) print(dom.build2()) plt.imshow(dom.build2()) plt.show()
尝试添加墙体的代码片段(未生效)
for key in params["wall"].keys(): w_row_min = min([tup[0] for tup in params["wall"][key]]) w_row_max = max([tup[0] for tup in params["wall"][key]]) w_col_min = min([tup[1] for tup in params["wall"][key]]) w_col_max = max([tup[1] for tup in params["wall"][key]]) self.matrices[key][w_row_max - w_row_min, w_col_max - w_col_min] = 2
问题分析
- 尝试在子矩阵
self.matrices[key]中设置墙体,但后续将子矩阵赋值给全局矩阵bigmatrix时,会覆盖对应位置的墙体值 - 坐标计算逻辑错误:
w_row_max - w_row_min和w_col_max - w_col_min仅能获取单个点,无法覆盖墙体的所有坐标 - 子矩阵的局部坐标与全局矩阵
bigmatrix的坐标不匹配,导致墙体位置设置错误
解决方案
直接在全局矩阵bigmatrix上设置墙体的全局坐标,避免被房间矩阵覆盖。修改Dom类的__init__方法,在完成房间矩阵赋值后添加墙体设置逻辑:
修改后的完整代码
import numpy as np import matplotlib.pyplot as plt class Dom: def __init__(self, params): self.params = params matrices = {} self.matrices = matrices for key in params["indexes"].keys(): row_min = min([tup[0] for tup in params["indexes"][key]]) row_max = max([tup[0] for tup in params["indexes"][key]]) col_min = min([tup[1] for tup in params["indexes"][key]]) col_max = max([tup[1] for tup in params["indexes"][key]]) self.matrices[key] = np.zeros((row_max - row_min, col_max - col_min)) mask = params["mask"][key] self.matrices[key][mask == 1] = 1 self.bigmatrix = np.zeros((100, 100)) for key in params["indexes"].keys(): row_min = min([tup[0] for tup in params["indexes"][key]]) row_max = max([tup[0] for tup in params["indexes"][key]]) col_min = min([tup[1] for tup in params["indexes"][key]]) col_max = max([tup[1] for tup in params["indexes"][key]]) self.bigmatrix[row_min:row_max, col_min:col_max] = self.matrices[key] # 添加墙体设置逻辑:直接在全局矩阵上赋值 if "wall" in self.params: for _, wall_coords in self.params["wall"].items(): for (row, col) in wall_coords: # 确保坐标在全局矩阵范围内 if 0 <= row < self.bigmatrix.shape[0] and 0 <= col < self.bigmatrix.shape[1]: self.bigmatrix[row, col] = 2 def build(self): return self.matrices.values() def build2(self): return self.bigmatrix if __name__ == '__main__': params = {"indexes": {"I": [(0, 0), (0, 50), (50, 0), (50, 50)], "II": [(0, 50), (0, 100), (50,50), (50, 100)], "III": [(50, 0), (50, 100), (70, 0), (70, 100)], "IV": [(70, 0), (70,50), (100,0), (100,50)], "V": [(70,50), (70,100), (100,50), (100, 100)]}, "rozdzielczosc": {}, "mask": {"I": 1, "II": 0, "III": 1, "IV": 1, "V": 1}, "wall":{"I":[(0,49), (0,50), (50,49), (50,50)]}} dom = Dom(params) plt.imshow(dom.build2(), cmap='viridis') # 用viridis颜色映射更易区分不同值 plt.colorbar() # 添加颜色条,直观查看数值对应颜色 plt.show()
关键修改点
- 在完成
bigmatrix的房间赋值后,遍历params["wall"]中的所有墙体坐标 - 直接在
bigmatrix的对应全局坐标位置赋值为2,避免被房间矩阵覆盖 - 添加坐标范围检查,防止越界报错
- 优化绘图部分:添加颜色映射
cmap='viridis'和颜色条plt.colorbar(),更清晰区分空白、房间和墙体
效果说明
运行修改后的代码,plt.imshow()会显示出三种不同颜色的区域:
- 空白区域(值为0):对应颜色条的最左侧
- 房间区域(值为1):中间颜色
- 墙体区域(值为2):对应颜色条的最右侧
内容的提问来源于stack exchange,提问作者camouro
相关产品推荐
相关产品推荐

