matplotlib 底图绘制对应于地图上点大小的图例
matplotlib basemap plotting legend corresponding to size of points on map
我正在使用 matplotlib 的底图功能在地图上绘制数据点。每个点都根据 5 公里半径内存在的 co-occurring 个点进行加权。我想在底部放置一个对应于 different-sized 爆发的参考 table,但是我不知道该怎么做。到目前为止,这是我的代码:
map = Basemap(llcrnrlon=-20.,llcrnrlat=-40,urcrnrlon=160.,urcrnrlat=40.,projection='cyl', lat_0=13.5317, lon_0=2.4604)
map.drawmapboundary(fill_color='paleturquoise')
map.fillcontinents(color='olivedrab',lake_color='paleturquoise')
map.drawcoastlines()
map.drawcountries()
map.drawstates()
used = set()
for i,j,k,n in DATA:
if map.is_land(i,j):
if k in used: continue
used.add(k)
alpha = 0.5
if n == 1:
alpha = 1
n *= 3
map.plot(i, j, marker='o',color='r',ms=n, alpha=alpha)
plt.show()
注意,DATA 是一个 4 元组列表。 4 元组中的每个条目对应于 (latitude, longitude, unique ID corresponding to points co-occuring within a 5x5 km square, number of points with the same uniq ID)
结果:
最明显的选择是首先在 matplotlib
中创建自定义标签和句柄,然后用它们初始化自定义图例。例如,如果我们选择一个 "showcase" 五个点大小的样本,运行从 1 到 5,您可能想要按照以下方式做一些事情:
def outbreak_artist(size):
""" Returns a single-point marker artist of a given size """
# note that x3 factor corresponds to your
# internal scaling within the for loop
return plt.Line2D((0,), (0,), color='r', marker='o',
ms=size*3, alpha=alpha, linestyle='')
sizes = [1, 2, 3, 4, 5]
# adapted from
# to place the legend beneath the figure neatly
ax = plt.gca()
box = ax.get_position()
ax.set_position([box.x0, box.y0 + box.height * 0.1,
box.width, box.height * 0.9])
red_dots = [outbreak_artist(size) for size in sizes]
labels = ["{} outbreaks".format(size) for size in sizes]
ax.legend(red_dots, labels, loc='upper center',
bbox_to_anchor=(0.5, -0.05), ncol=5)
plt.show()
我稍微调整了图例的位置,使其脱离了 this post.
之后的情节
P.S.: 我想我 运行 fig, ax = plt.subplots(figsize = (9.44, 4.76))
在制作 Basemap
之前使图例大小与地图大小对齐。
我正在使用 matplotlib 的底图功能在地图上绘制数据点。每个点都根据 5 公里半径内存在的 co-occurring 个点进行加权。我想在底部放置一个对应于 different-sized 爆发的参考 table,但是我不知道该怎么做。到目前为止,这是我的代码:
map = Basemap(llcrnrlon=-20.,llcrnrlat=-40,urcrnrlon=160.,urcrnrlat=40.,projection='cyl', lat_0=13.5317, lon_0=2.4604)
map.drawmapboundary(fill_color='paleturquoise')
map.fillcontinents(color='olivedrab',lake_color='paleturquoise')
map.drawcoastlines()
map.drawcountries()
map.drawstates()
used = set()
for i,j,k,n in DATA:
if map.is_land(i,j):
if k in used: continue
used.add(k)
alpha = 0.5
if n == 1:
alpha = 1
n *= 3
map.plot(i, j, marker='o',color='r',ms=n, alpha=alpha)
plt.show()
注意,DATA 是一个 4 元组列表。 4 元组中的每个条目对应于 (latitude, longitude, unique ID corresponding to points co-occuring within a 5x5 km square, number of points with the same uniq ID)
结果:
最明显的选择是首先在 matplotlib
中创建自定义标签和句柄,然后用它们初始化自定义图例。例如,如果我们选择一个 "showcase" 五个点大小的样本,运行从 1 到 5,您可能想要按照以下方式做一些事情:
def outbreak_artist(size):
""" Returns a single-point marker artist of a given size """
# note that x3 factor corresponds to your
# internal scaling within the for loop
return plt.Line2D((0,), (0,), color='r', marker='o',
ms=size*3, alpha=alpha, linestyle='')
sizes = [1, 2, 3, 4, 5]
# adapted from
# to place the legend beneath the figure neatly
ax = plt.gca()
box = ax.get_position()
ax.set_position([box.x0, box.y0 + box.height * 0.1,
box.width, box.height * 0.9])
red_dots = [outbreak_artist(size) for size in sizes]
labels = ["{} outbreaks".format(size) for size in sizes]
ax.legend(red_dots, labels, loc='upper center',
bbox_to_anchor=(0.5, -0.05), ncol=5)
plt.show()
我稍微调整了图例的位置,使其脱离了 this post.
之后的情节P.S.: 我想我 运行 fig, ax = plt.subplots(figsize = (9.44, 4.76))
在制作 Basemap
之前使图例大小与地图大小对齐。