带有由大小决定的 zorder 的底图散点图

Basemap scatterplot with zorder determined by size

我想制作一个底图,上面有一个散点图,点的 zorder 由每个点的大小决定,这样就不会完全被另一个点覆盖。 (理想的最终结果看起来像靶心。)

假设我有以下代码:

Ca_data = array([0.088, 0.094, 0.097, 0.126, 0.112, 0.092, 0.076, 0.105])
SO4_data = array([0.109, 0.001, 0.001, 0.007, 0.214, 0.005, 0.008, 0.559])
longitude = linspace(-101, -100, 8)
latitude = linspace(34.5, 35, 8)

m=Basemap(llcrnrlon=-101,llcrnrlat=34.5,urcrnrlon=-100,urcrnrlat=35,resolution='c', epsg=4326)
m.arcgisimage(server='http://server.arcgisonline.com/ArcGIS', service='ESRI_Imagery_World_2D', xpixels=1500, ypixels=1500, zorder=1)
m.scatter(longitude, latitude, latlon=True, s=6000*Ca_data,c='r',marker="o",label='Ca')
m.scatter(longitude, latitude, latlon=True, s=6000*SO4_data,c='b',marker="o",label='SO4')
plt.show()

实际上,任何 SO4 大于 Ca 的地方,我只会看到 SO4。我已经考虑进入并为每一行添加一个 zorder,但我认为这不会很好,因为我有更多的元素要添加到相同的问题中。有什么想法吗?

我能看到如何做到这一点的唯一方法是同时绘制两个数据集。否则无法 not 在第一个数据集之上绘制第二个数据集。

大部分都可以轻松完成,唯一的问题是 scatterlabel kwarg。我们可以为 scatter 指定元素 (array_like) 大小和颜色,但我们不能用标签来做到这一点。尽管如此,由于数据的可视化更为重要,我会沿着这条路走下去,稍后解决与标签相关的问题(主要是传说):

import numpy as np
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

Ca_data = np.array([0.088, 0.094, 0.097, 0.126, 0.112, 0.092, 0.076, 0.105])
SO4_data = np.array([0.109, 0.001, 0.001, 0.007, 0.214, 0.005, 0.008, 0.559])
longitude = np.linspace(-101, -100, 8)
latitude = np.linspace(34.5, 35, 8)

# this is the new part: concatenate all the data    
plotlon = np.tile(longitude,2)
plotlat = np.tile(latitude,2)
plotdat = np.concatenate((6000*Ca_data,6000*SO4_data)) # sizes
cdat = np.repeat(('r','b'),longitude.size)             # colors

# determine reverse sorting order
inds = np.argsort(plotdat)[::-1]

plt.figure()
m = Basemap(llcrnrlon=-101,llcrnrlat=34.5,urcrnrlon=-100,urcrnrlat=35,resolution='c', epsg=4326)
m.arcgisimage(server='http://server.arcgisonline.com/ArcGIS', service='ESRI_Imagery_World_2D', xpixels=1500, ypixels=1500, zorder=1)
# use a single scatter() call, with ordered-concatenated data
m.scatter(plotlon[inds], plotlat[inds], latlon=True, s=plotdat[inds],c=cdat[inds],marker="o") # label has been removed!

plt.show()

推广到 n 数据集很简单:您需要 tile 纬度和经度 n 次而不是 2 次,并且每个数据集都需要一种颜色,然后 repeat.