无法在底图中使用散点图
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 系列对象作为 x
和 y
参数传递给它。但是这段代码确实有效(区别在于额外的 tolist()
调用):
my_map.plot(df_loc.lon.tolist(),
df_loc.lat.tolist(),
'bo',
latlon=True)
这是 zorder
的问题。具体来说,fillcontinents
zorder 大于 scatter
点的 zorder,因此散点最终位于大陆填充下方(因此不可见)。
解决此问题的两种方法:
减少fillcontinents
zorder:
my_map.fillcontinents(color='coral', zorder=0)
增加scatter
zorder:
my_map.scatter(x, y, s=10, zorder=10)
我正在学习教程 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 系列对象作为 x
和 y
参数传递给它。但是这段代码确实有效(区别在于额外的 tolist()
调用):
my_map.plot(df_loc.lon.tolist(),
df_loc.lat.tolist(),
'bo',
latlon=True)
这是 zorder
的问题。具体来说,fillcontinents
zorder 大于 scatter
点的 zorder,因此散点最终位于大陆填充下方(因此不可见)。
解决此问题的两种方法:
减少
fillcontinents
zorder:my_map.fillcontinents(color='coral', zorder=0)
增加
scatter
zorder:my_map.scatter(x, y, s=10, zorder=10)