将 pandas csv 数据绘制到 cartopy 地图上
Plotting pandas csv data onto cartopy map
python 的新手并且编码一般所以请原谅任何明显的错误。我在将城市人口数据(每个国家/地区居住在城市地区的人数以千计)绘制到地图上时遇到了一些麻烦。人口数据位于 CSV 文件中,按国家、纬度、经度和年份索引,年份为 1950-2050。我使用 def 编写了一个函数,这样我就可以输入年份并按国家/地区绘制那年的人口图。我希望标记的大小与每个国家/地区的人口成比例。然而,似乎绘制的标记大小与列表中国家/地区的位置成正比,因此列表顶部的国家(按字母顺序排列)具有较小的标记,例如巴西有一个小标记 depsite 有一个大城市人口。任何帮助将不胜感激。代码如下:
import pandas as pd
from matplotlib.animation import FuncAnimation
import cartopy.crs as ccrs
import cartopy.feature as cfeature
country_urban_pop = pd.read_csv('/Users/myusername/Desktop/urbanisation_data.csv')
def urban_pop_plot(year):
lat, lon = country_urban_pop['latitude'], country_urban_pop['longitude']
population = country_urban_pop[year]
fig = plt.figure(figsize=(20, 16))
ax = plt.axes(projection=ccrs.PlateCarree())
ax.add_feature(cfeature.LAND)
ax.add_feature(cfeature.OCEAN)
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.BORDERS, linestyle=':')
ax.add_feature(cfeature.LAKES, alpha=0.5)
ax.add_feature(cfeature.RIVERS)
ax.coastlines()
ax.set_global()
ax.gridlines()
ax.stock_img()
plt.scatter(lon, lat, transform=ccrs.PlateCarree(), \
label=None, c=population, cmap='Oranges', linewidth=0, alpha=0.5)
plt.axis(aspect='equal')
plt.xlabel('longitude')
plt.ylabel('latitude')
plt.colorbar(label='population')
plt.clim(0, 10)
urban_pop_plot('1950')
Matplotlib.pyplot.scatter 接受参数 "s" 作为标量或数组作为点数 (https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html) 的标记大小。
假设 "population" 包含您希望将其转换为 numpy 数组的年度人口:population_array = np.array(population)
并对其进行归一化,以便您获得一个有意义的点值。一个好的起点可能是将其标准化为 0 到 1 之间的值,然后将其乘以合适的标量。规范化数据指南:。
python 的新手并且编码一般所以请原谅任何明显的错误。我在将城市人口数据(每个国家/地区居住在城市地区的人数以千计)绘制到地图上时遇到了一些麻烦。人口数据位于 CSV 文件中,按国家、纬度、经度和年份索引,年份为 1950-2050。我使用 def 编写了一个函数,这样我就可以输入年份并按国家/地区绘制那年的人口图。我希望标记的大小与每个国家/地区的人口成比例。然而,似乎绘制的标记大小与列表中国家/地区的位置成正比,因此列表顶部的国家(按字母顺序排列)具有较小的标记,例如巴西有一个小标记 depsite 有一个大城市人口。任何帮助将不胜感激。代码如下:
import pandas as pd
from matplotlib.animation import FuncAnimation
import cartopy.crs as ccrs
import cartopy.feature as cfeature
country_urban_pop = pd.read_csv('/Users/myusername/Desktop/urbanisation_data.csv')
def urban_pop_plot(year):
lat, lon = country_urban_pop['latitude'], country_urban_pop['longitude']
population = country_urban_pop[year]
fig = plt.figure(figsize=(20, 16))
ax = plt.axes(projection=ccrs.PlateCarree())
ax.add_feature(cfeature.LAND)
ax.add_feature(cfeature.OCEAN)
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.BORDERS, linestyle=':')
ax.add_feature(cfeature.LAKES, alpha=0.5)
ax.add_feature(cfeature.RIVERS)
ax.coastlines()
ax.set_global()
ax.gridlines()
ax.stock_img()
plt.scatter(lon, lat, transform=ccrs.PlateCarree(), \
label=None, c=population, cmap='Oranges', linewidth=0, alpha=0.5)
plt.axis(aspect='equal')
plt.xlabel('longitude')
plt.ylabel('latitude')
plt.colorbar(label='population')
plt.clim(0, 10)
urban_pop_plot('1950')
Matplotlib.pyplot.scatter 接受参数 "s" 作为标量或数组作为点数 (https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html) 的标记大小。
假设 "population" 包含您希望将其转换为 numpy 数组的年度人口:population_array = np.array(population)
并对其进行归一化,以便您获得一个有意义的点值。一个好的起点可能是将其标准化为 0 到 1 之间的值,然后将其乘以合适的标量。规范化数据指南:。