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

寻求Python工具可视化408×408 numpy数组的沙盒游戏热力图

解决方案:可视化408×408地块热力图

为什么Seaborn/Matplotlib不适合你的需求

Seaborn热力图基于Matplotlib的静态绘图逻辑,面对408×408的大尺寸数组时,即便放大画布尺寸,也会受限于像素密度导致单个地块过小,无法清晰标注价格等细节;同时静态图无法实现交互式缩放、滑动查看的需求。

推荐工具与实现方案

1. Plotly Express:交互式热力图(带缩放、悬停信息)

Plotly支持交互式可视化,可通过鼠标滚轮缩放、拖拽平移,悬停时自动显示地块详情,完全适配大尺寸地图的查看需求。

示例代码:

import plotly.express as px
import numpy as np

# 模拟408×408的售卖次数数据
arr = np.random.randint(0, 100, size=(408, 408))
# 生成对应Sandbox的坐标标签范围
x = list(range(-204, 204))
y = list(reversed(range(-204, 204)))

# 创建交互式热力图
fig = px.imshow(
    arr,
    x=x,
    y=y,
    color_continuous_scale='RdYlGn',
    labels=dict(x="X坐标", y="Y坐标", color="售卖次数")
)

# 自定义悬停信息(替换为你的真实价格数据)
fig.update_traces(
    hovertemplate='X: %{x}<br>Y: %{y}<br>售卖次数: %{z}<br>价格: $%{z}00'
)

# 布局设置,支持全屏显示
fig.update_layout(
    width=1200,
    height=1200,
    title="Sandbox地块售卖热力图",
    xaxis_title="X坐标",
    yaxis_title="Y坐标"
)

# 在浏览器中打开交互式图表
fig.show()

2. Bokeh:交互式地图(带滑块和工具)

Bokeh适合构建带自定义控件(如滑块)的大尺寸地图,支持丰富的交互行为,可灵活扩展功能。

示例代码:

from bokeh.plotting import figure, show, output_file
from bokeh.models import LinearColorMapper, ColorBar, HoverTool
import numpy as np

# 模拟数据
arr = np.random.randint(0, 100, size=(408, 408))
x = list(range(-204, 204))
y = list(reversed(range(-204, 204)))

# 颜色映射配置
color_mapper = LinearColorMapper(palette="RdYlGn10", low=arr.min(), high=arr.max())

# 创建绘图对象
p = figure(
    title="Sandbox地块热力图",
    x_range=x,
    y_range=y,
    tools="pan,wheel_zoom,box_zoom,reset,save",
    width=1200,
    height=1200
)

# 添加热力图块
p.image(
    image=[arr],
    x=-204,
    y=-204,
    dw=408,
    dh=408,
    color_mapper=color_mapper,
    alpha=0.8
)

# 配置悬停提示
hover = HoverTool()
hover.tooltips = [
    ("X坐标", "$x"),
    ("Y坐标", "$y"),
    ("售卖次数", "@image"),
    ("价格", "$@image00")  # 替换为真实价格字段
]
p.add_tools(hover)

# 添加颜色条
color_bar = ColorBar(color_mapper=color_mapper, label_standoff=12, location=(0,0))
p.add_layout(color_bar, 'right')

# 输出到HTML文件,浏览器打开查看
output_file("sandbox_heatmap.html")
show(p)

3. PyQtGraph:高性能桌面GUI可视化

如果需要本地桌面应用,PyQtGraph基于PyQt框架,性能极高,能快速渲染大尺寸数组,支持全屏显示、实时交互、缩放控制,还可轻松添加自定义标注。

示例代码(需安装PyQt5和PyQtGraph):

import pyqtgraph as pg
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
import numpy as np

class HeatmapWindow(QMainWindow):
    def __init__(self, arr):
        super().__init__()
        self.setWindowTitle("Sandbox地块热力图")
        self.setGeometry(100, 100, 1200, 1200)
        
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QVBoxLayout(central_widget)
        
        # 创建图像视图组件
        self.view = pg.ImageView()
        layout.addWidget(self.view)
        
        # 设置数据与颜色映射
        self.view.setImage(arr.T)  # PyQtGraph坐标轴方向需转置
        self.view.setColorMap(pg.colormap.get('RdYlGn'))
        
        # 绑定鼠标移动事件,显示地块详情
        self.view.scene.sigMouseMoved.connect(self.on_mouse_move)
        
        # 启用矩形缩放模式
        self.view.getViewBox().setMouseMode(pg.ViewBox.RectMode)
        
    def on_mouse_move(self, pos):
        # 转换鼠标位置为数组索引
        scene_pos = self.view.getImageItem().mapFromScene(pos)
        x, y = int(scene_pos.x()), int(scene_pos.y())
        if 0 <= x < arr.shape[1] and 0 <= y < arr.shape[0]:
            count = arr[y, x]
            price = count * 100  # 替换为真实价格数据
            self.statusBar().showMessage(f"X: {x-204}, Y: {203-y}, 售卖次数: {count}, 价格: ${price}")

if __name__ == "__main__":
    app = QApplication([])
    arr = np.random.randint(0, 100, size=(408, 408))
    window = HeatmapWindow(arr)
    window.showMaximized()  # 全屏显示
    app.exec_()

方案选择总结

  • 快速实现交互式可视化:选Plotly,无需额外框架,直接在浏览器操作。
  • 需要自定义控件扩展:选Bokeh,灵活度更高。
  • 追求本地桌面应用性能:选PyQtGraph,适配全屏和实时交互需求。

这些方案均能解决Seaborn静态图的清晰度问题,支持全屏显示和地块级信息标注。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:46:32