You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在矩阵中添加墙体并通过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()

关键修改点

  1. 在完成bigmatrix的房间赋值后,遍历params["wall"]中的所有墙体坐标
  2. 直接在bigmatrix的对应全局坐标位置赋值为2,避免被房间矩阵覆盖
  3. 添加坐标范围检查,防止越界报错
  4. 优化绘图部分:添加颜色映射cmap='viridis'和颜色条plt.colorbar(),更清晰区分空白、房间和墙体

效果说明

运行修改后的代码,plt.imshow()会显示出三种不同颜色的区域:

  • 空白区域(值为0):对应颜色条的最左侧
  • 房间区域(值为1):中间颜色
  • 墙体区域(值为2):对应颜色条的最右侧

内容的提问来源于stack exchange,提问作者camouro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:54:55