无法在底图中使用散点图

Unable to use scatter plot in Basemap

我正在学习教程 Visualization: Mapping Global Earthquake Activity 以更加熟悉底图。

我想做的是在地图上的 Pandas DataFrame 中散点绘制数据。

我的地图的初始化代码:

my_map = Basemap(projection='merc', 
                 lat_0=50.93, lon_0=4.13,
                 llcrnrlat=49.339950, llcrnrlon=1.777668,
                 urcrnrlat=51.601360, urcrnrlon=6.925303,
                 resolution='h', area_thresh=1.0)

my_map.drawcoastlines()
my_map.drawcountries()
my_map.fillcontinents(color='coral')
my_map.drawmapboundary()

到目前为止一切顺利。现在获取实际数据。我的 df 的结构如下所示:

lat    float64
lon    float64
id       int64
dtype: object

样本:

|      |     lat |     lon |   id |
|-----:|--------:|--------:|-----:|
| 1083 | 51.8205 | 4.62573 |    7 |
|  211 | 50.5155 | 3.89612 |    1 |
|   89 | 50.3397 | 4.61034 |    1 |

id 列实际上是一个计数(df 是更详细的 df 的聚合)。 id 列中的值应用于定义标记大小。

我从这个简单的图(还不是散点图)开始,它很有效。

x,y = my_map(df_loc.lon.tolist(), df_loc.lat.tolist())
my_map.plot(x, y, 'bo', markersize=10)
plt.show()

因为我希望标记大小取决于计数(即 id 列),所以我需要从 plot 切换到 scatter

如果我尝试:my_map.scatter(x, y, s=10)(即固定大小),结果将是一张空地图(未绘制任何点)。

如果你能告诉我我做错了什么,我将不胜感激。奇怪的是,常规的散点图效果很好(可能比较不好,但仍然如此):

plt.scatter(df_loc.lon, df_loc.lat, s=df_loc.id, alpha=.3)
plt.ylim(49.339950, 51.601360)
plt.xlim(1.777668, 6.925303)

加分项:

根据我在文档中阅读的内容,如果指定了 latlon=True 参数,则无需将 lat/lon 转换为地图投影的额外步骤。

If latlon keyword is set to True, x,y are intrepreted as longitude and latitude in degrees. Data and longitudes are automatically shifted to match map projection region for cylindrical and pseudocylindrical projections, and x,y are transformed to map projection coordinates.

但是,如果我改变这个:

x,y = my_map(df_loc.lon.tolist(), df_loc.lat.tolist())
my_map.plot(x, y, 'bo', markersize=10)

对此:

my_map.plot(df_loc.lon, df_loc.lat, 'bo', latlon=True)

我遇到了错误:

SystemError: <class 'RuntimeError'> returned a result with an error set

这不是 latlon 参数的用途吗?

更新:

似乎 plot 函数不喜欢将 Pandas 系列对象作为 xy 参数传递给它。但是这段代码确实有效(区别在于额外的 tolist() 调用):

my_map.plot(df_loc.lon.tolist(), 
            df_loc.lat.tolist(), 
            'bo', 
            latlon=True)

这是 zorder 的问题。具体来说,fillcontinents zorder 大于 scatter 点的 zorder,因此散点最终位于大陆填充下方(因此不可见)。

解决此问题的两种方法:

  1. 减少fillcontinents zorder:

    my_map.fillcontinents(color='coral', zorder=0)
    
  2. 增加scatter zorder:

    my_map.scatter(x, y, s=10, zorder=10)