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

如何将矩形热力图转换为适配梯形礼堂的座位热力图?

梯形礼堂座位热力图实现思路

针对梯形礼堂(后排座位数少于前排)的座位热度展示,常规矩形热力图的空白区域会干扰视觉效果,以下是几种可行的自定义梯形布局实现思路:

核心思路:自定义绘制座位块

通过手动计算每一排座位的坐标,绘制适配梯形结构的独立座位块,而非依赖自动生成的矩形网格。

方法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 18:20:35