如何在摩尔维德投影上绘制坐标热图
How to plot a heatmap of coordinates on a mollweide projection
我有一组纬度和经度坐标(即列表列表:[[20,24],[100,-3],...]
),我想在 mollweide 投影上绘制热图(不仅仅是散点图)。本质上,我想要的是一个 seaborn hist2d 情节,但作为一个 mollweide。有关我的意思的参考,请参阅上传的图片。有谁知道如何做到这一点?
我创建了一些随机数据并展示了生成直方图的方法。我希望这是你正在寻找的东西。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# create some random data for histogram
base = [[-20, 30], [100, -20]]
data = []
for _ in range(10000):
data.append((
base[0][0] + np.random.normal(0, 20),
base[0][1] + np.random.normal(0, 10)
))
data.append((
base[1][0] + np.random.normal(0, 20),
base[1][1] + np.random.normal(0, 10)
))
data = np.array(data) / 180 * np.pi # shape (n, 2)
# create bin edges
bin_number = 40
lon_edges = np.linspace(-np.pi, np.pi, bin_number + 1)
lat_edges = np.linspace(-np.pi/2., np.pi/2., bin_number + 1)
# calculate 2D histogram, the shape of hist is (bin_number, bin_number)
hist, lon_edges, lat_edges = np.histogram2d(
*data.T, bins=[lon_edges, lat_edges], density=True
)
# generate the plot
cmap = plt.cm.Greens
fig = plt.figure()
ax = fig.add_subplot(111, projection='mollweide')
ax.pcolor(
lon_edges[:-1], lat_edges[:-1],
hist.T, # transpose from (row, column) to (x, y)
cmap=cmap, shading='auto',
vmin=0, vmax=1
)
# hide the tick labels
ax.set_xticks([])
ax.set_yticks([])
# add the colorbar
cbar = plt.colorbar(
plt.cm.ScalarMappable(
norm=mpl.colors.Normalize(0, 1), cmap=cmap
)
)
cbar.set_label("Density Distribution")
plt.show()
得到下图
我有一组纬度和经度坐标(即列表列表:[[20,24],[100,-3],...]
),我想在 mollweide 投影上绘制热图(不仅仅是散点图)。本质上,我想要的是一个 seaborn hist2d 情节,但作为一个 mollweide。有关我的意思的参考,请参阅上传的图片。有谁知道如何做到这一点?
我创建了一些随机数据并展示了生成直方图的方法。我希望这是你正在寻找的东西。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# create some random data for histogram
base = [[-20, 30], [100, -20]]
data = []
for _ in range(10000):
data.append((
base[0][0] + np.random.normal(0, 20),
base[0][1] + np.random.normal(0, 10)
))
data.append((
base[1][0] + np.random.normal(0, 20),
base[1][1] + np.random.normal(0, 10)
))
data = np.array(data) / 180 * np.pi # shape (n, 2)
# create bin edges
bin_number = 40
lon_edges = np.linspace(-np.pi, np.pi, bin_number + 1)
lat_edges = np.linspace(-np.pi/2., np.pi/2., bin_number + 1)
# calculate 2D histogram, the shape of hist is (bin_number, bin_number)
hist, lon_edges, lat_edges = np.histogram2d(
*data.T, bins=[lon_edges, lat_edges], density=True
)
# generate the plot
cmap = plt.cm.Greens
fig = plt.figure()
ax = fig.add_subplot(111, projection='mollweide')
ax.pcolor(
lon_edges[:-1], lat_edges[:-1],
hist.T, # transpose from (row, column) to (x, y)
cmap=cmap, shading='auto',
vmin=0, vmax=1
)
# hide the tick labels
ax.set_xticks([])
ax.set_yticks([])
# add the colorbar
cbar = plt.colorbar(
plt.cm.ScalarMappable(
norm=mpl.colors.Normalize(0, 1), cmap=cmap
)
)
cbar.set_label("Density Distribution")
plt.show()
得到下图