使用Matplotlib的Hexbin创建热图

2 投票
1 回答
1315 浏览
提问于 2025-04-17 05:01

我不是程序员,但最近我在用Python做一些数据分析,偶然发现了Matplotlib这个工具。我有一系列地理坐标的数据点,想把它们可视化。数据包括地理坐标和每个地点的平方英尺数(SQFT):

纬度,经度,平方英尺

我大约有2.5万条这样的数据点,想在一个二维图像上展示这些平方英尺的总和;简单来说,就是想制作一个平方英尺的热力图。我已经用Matplotlib创建了一个六边形图(hexbin),用的是纬度和经度的数据,但这个图只能告诉我有多少个数据点落在每个六边形里。我搞不清楚怎么把平方英尺的数据加到这些六边形里。我查了Matplotlib的文档,发现可以输入一个额外的变量,他们称之为C,但我不知道该怎么格式化这些数据(或者这是否真的能满足我的需求)。

1 个回答

2

正如@Brian L的评论所说,要在每个单元格中获得累计的平方英尺值,你需要把reduce_C_function改成sum。这意味着Matplotlib会使用Python的sum函数(默认是用平均值函数)来根据C(在这个例子中是SQFT)来决定那个区域的颜色。下面是一个使用随机生成数据的例子。

import numpy as np
import matplotlib.pyplot as plt

plt.close("all")

N = 158                             # OP said 25k datapoints; sqrt(25000) ~ 158
latitude = np.random.standard_normal(N**2) 
longitude = 12 * np.random.standard_normal(N**2) 

var = 100
SQFT = 1_000*np.exp(-(latitude**2 + longitude**2)/2/var)/2/np.pi/var + 1

fig, ax = plt.subplots()
p = ax.hexbin(longitude, latitude, C=SQFT, gridsize=50, reduce_C_function=sum)
fig.colorbar(p, ax=ax, label="SQFT")
ax.set_xlabel("Longitude")
ax.set_ylabel("Latitude")
fig.show() 

撰写回答