从 matplotlib.pyplot.hexbin 图中获取六边形面积

问题描述 投票:0回答:1

我正在尝试使用 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")

有谁知道如何获得准确的面积吗?

提前谢谢您!

matplotlib polygon area
1个回答
0
投票

IIUC,您可以从

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 ?

enter image description here

使用的输入:

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),
    }
)
© www.soinside.com 2019 - 2024. All rights reserved.