我正在尝试使用 hexbin 绘制质量表面密度,因为我的输入是包含数千个点的数据框,其中包含 [lon、lat、mass]
hexbin 速度很快,我想生成一个 表面密度图(在本例中每平方米六边形的质量为 kg),因此我使用以下对 hexbin 的调用:
# rounded number of hexagons in x to have a hexagon widths of aprox 100m
nx = round(111000 * lenght_x / 100)
hb = df.plot.hexbin(
x="lon",
y="lat",
C="mass",
gridsize=nx,
cmap="viridis",
mincnt=3,
ax=ax,
reduce_C_function=np.sum,
)
我使用reduce_C_fuinction来获得质量之和,现在我想除以六边形面积,但我没有找到一种方法来计算可以生成的不规则六边形的确切面积。
我只能获得以下六边形的中心:
# Get hexagon centers
pollycollection = hb.get_children()[0]
centers = pollycollection.get_offsets()
x_c = [p[0] for p in centers]
y_c = [p[1] for p in centers]
plt.plot(x_c, y_c, "x-", color="red")
有谁知道如何获得准确的面积吗?
提前谢谢您!
Polygon
顶点制作 hexbin
,然后使用 area
对其进行标准化 :
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(6, 4))
hb = ax.hexbin(
x="lon",
y="lat",
C="mass",
data=df,
gridsize=10,
cmap="viridis",
mincnt=3,
reduce_C_function=np.sum,
)
from shapely import Polygon
import matplotlib.colors as mcolors
hb_array_n = hb.get_array() / Polygon(hb.get_paths()[0].vertices).area
norm = mcolors.Normalize(vmin=hb_array_n.min(), vmax=hb_array_n.max())
hb.set_norm(norm)
hb.set_array(hb_array_n)
cb = plt.colorbar(hb, label="Surface Density") # optional ?
使用的输入:
import numpy as np
import pandas as pd
np.random.seed(0)
N = 10_000
df = pd.DataFrame(
{
"lon": np.random.uniform(-180, 180, N),
"lat": np.random.uniform(-90, 90, N),
"mass": np.random.exponential(100, N),
}
)