如何将矩形热力图转换为适配梯形礼堂的座位热力图?
梯形礼堂座位热力图实现思路
针对梯形礼堂(后排座位数少于前排)的座位热度展示,常规矩形热力图的空白区域会干扰视觉效果,以下是几种可行的自定义梯形布局实现思路:
核心思路:自定义绘制座位块
通过手动计算每一排座位的坐标,绘制适配梯形结构的独立座位块,而非依赖自动生成的矩形网格。
方法1:Matplotlib 自定义多边形绘制
这是最直接的实现方式,通过计算每一排的宽度收缩比例,为每个座位生成对应的矩形块,整体呈现梯形效果:
import matplotlib.pyplot as plt import matplotlib.patches as patches import pandas as pd # 加载数据(替换为你的数据路径) df = pd.read_csv("礼堂座位数据.csv") # 确保排数和座位号为数值类型 df["排数"] = pd.to_numeric(df["排数"]) df["座位号"] = pd.to_numeric(df["座位号"]) # 配置礼堂参数 total_rows = df["排数"].max() front_row_width = 12 # 前排总宽度(可根据视觉效果调整) shrink_per_row = 0.6 # 每向后一排,左右两侧各收缩的宽度(控制梯形倾斜程度) # 初始化画布 fig, ax = plt.subplots(figsize=(10, 9)) # 颜色映射:购票数越高颜色越深 cmap = plt.cm.viridis ticket_min, ticket_max = df["购票数量"].min(), df["购票数量"].max() # 逐排绘制座位 for row in sorted(df["排数"].unique()): row_seats = df[df["排数"] == row] seat_count = len(row_seats) # 计算当前排的左右边界 row_shrink = (total_rows - row) * shrink_per_row row_left = row_shrink row_right = front_row_width - row_shrink # 单个座位的宽度 seat_width = (row_right - row_left) / seat_count # 映射排数到y轴坐标(反转y轴让前排在下方) y_pos = total_rows - row # 绘制当前排的每个座位 for seat in row_seats.itertuples(): seat_num = seat.座位号 ticket_count = seat.购票数量 # 计算座位的左右x坐标 seat_left = row_left + (seat_num - 1) * seat_width # 绘制座位矩形 rect = patches.Rectangle( (seat_left, y_pos), seat_width, 0.8, color=cmap((ticket_count - ticket_min)/(ticket_max - ticket_min)) ) ax.add_patch(rect) # 标注座位号和购票数(可选) ax.text( seat_left + seat_width/2, y_pos + 0.4, f"{seat_num}\n{ticket_count}", ha="center", va="center", fontsize=7 ) # 调整坐标轴 ax.set_xlim(0, front_row_width) ax.set_ylim(0, total_rows) ax.set_title("礼堂座位热度分布图(梯形布局)") ax.set_xlabel("座位横向位置") ax.set_ylabel("排数(前排在下)") # 添加颜色条 sm = plt.cm.ScalarMappable(cmap=cmap, norm=plt.Normalize(vmin=ticket_min, vmax=ticket_max)) sm.set_array([]) fig.colorbar(sm, ax=ax, label="1年内购票数量") plt.tight_layout() plt.show()
方法2:Plotly 交互式梯形热力图
如果需要交互式效果(hover显示详情),可以用Plotly的多边形轨迹绘制每个座位:
- 为每个座位计算梯形(或矩形)的四个顶点坐标
- 使用
go.Polygon绘制每个座位块,通过fillcolor映射购票数 - 配置hover信息显示座位号、排数和购票数
为什么px.imshow不合适?
px.imshow是基于矩形网格的热力图,会自动填充后排不存在的座位为空白,无法贴合梯形礼堂的实际结构,导致视觉上的混乱。
内容的提问来源于stack exchange,提问作者MichaelMsc
相关产品推荐
相关产品推荐

