写在前面
经常会看到一些交流群里讨论关于python虚拟环境中某些库安装不成功的问题,比如说关于地学数据处理和绘图的salem、geopandas、关于wrf输出的wrf-python,以及一些仿照matlab绘图风格的basemap。
这里,将我常用的一个安装方法分享给大家,便于在安装的虚拟环境出现问题时,可以比较便捷、快速的安装常用的库。
主要包括以下几个库:
gdal rasterio shapely geopandas scipy pyproj netCDF4 xarray joblib salem pillow matplotlib scikit-image cartopy wrf-python cmaps metpy basemap
包括常用到的salem、geopandas、metpy、wrf-python
具体步骤
打开conda prompt
一般在windows 上安装完anaconda后,会在桌面-应用,里面出现Aanaconda3的目录,里面包含两个prompt,分别是:
- Anaconda Powershell Prompt
- Anaconda Prompt
任选一个用一般没什么问题,除非遇到需要管理员权限的部分可以考虑第一个,我这里选择第二个。
先检查一下自己的虚拟环境
conda env list
像我这里,就有3个虚拟环境,前两个分别为深度学习、日常使用的使用,最后一个为python=3.11版本下的备份环境
新建一个虚拟环境
下面开始新建一个新的虚拟环境,这里新建的环境中的python版本还是3.11,一般不太会出错,虚拟环境名称为:p311
conda create -n p311 python=3.11
新建完成后,进入你命名的虚拟环境,比如我这里就是进入p311
的虚拟环境
conda activate p311
检查是否进入虚拟环境成功与否,最简单的方法就是看有没有提示报错,或者看你路径前的环境名称是否从base
切换到p311
安装相关库
进入虚拟环境后,下面就是安装以上提到的package,相比于一个个安装,这里推荐使用 conda 一键安装所有的package
-
使用conda install 而不是 pip install 进行安装,简单来说:原因在于 Conda 可以有效地解决依赖冲突和版本问题,而Pip 只管理 Python 包,无法安装非 Python 的依赖。如果某个包依赖于特定版本的非 Python 库,使用 pip 安装可能会遇到问题。
-
使用 conda install 同时安装多个package时,他会自动检索相关的依赖环境并选择合适的版本
安装命令:
conda install conda-forge::gdal rasterio shapely geopandas scipy pyproj netCDF4 xarray joblib salem pillow matplotlib scikit-image cartopy wrf-python cmaps metpy basemap
稍作等待即可,经过我的测试,如果在以上库中,再加上proplot会出现环境不适配的报错,感觉以上的库也是够日常使用了
下面可以进入spyder 或者 vscode中进行测试,如果是进入spyder的话,可以再虚拟环境中安装相关的spyder,
conda install spyder
这样点击相关虚拟环境名称的spyder,就可以直接进入使用了
相关库导入测试
等待安装完成,下面我进入vscode进行简单测试,选择我们刚刚安装的虚拟环境,可能需要安装一个ipykernel才能在vscode中运行,如果没有这个问题就不需要。
conda install ipykernel
导入相关的库。一般可以直接导入成功
测试 salem
测试代码来自官网
- https://salem.readthedocs.io/en/stable/auto_examples/index.html
import salem
import geopandas
from salem import mercator_grid, Map, get_demo_file
import matplotlib.pyplot as plt
# prepare the figure
f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(8, 7),dpi = 200)
# map extent
grid = mercator_grid(center_ll=(10.76, 46.79), extent=(18000, 14000))
sm = Map(grid, countries=False)
sm.set_lonlat_contours(interval=0)
sm.set_scale_bar()
# add topography
fpath = get_demo_file('hef_srtm.tif')
sm.set_topography(fpath)
sm.visualize(ax=ax1, addcbar=False, title='relief_factor=0.7 (default)')
# stronger shading
sm.set_topography(fpath, relief_factor=1.4)
sm.visualize(ax=ax2, addcbar=False, title='relief_factor=1.4')
# add color shading
z = sm.set_topography(fpath)
sm.set_data(z)
sm.set_cmap('topo')
sm.visualize(ax=ax3, title='Color with shading', addcbar=False)
# color without topo shading
sm.set_topography()
sm.visualize(ax=ax4, title='Color without shading', addcbar=False)
# make it nice
plt.tight_layout()
plt.show()
测试 geopandas
还是选择官网的测试代码,在他的基础上简单调整:
- https://geopandas.org/en/stable/gallery/index.html
这里选择的测试个例需要先安装一个库:
conda install libpysal
测试代码:
import geopandas
from geopandas import read_file
import mapclassify
import libpysal
import matplotlib.pyplot as plt
_ = libpysal.examples.load_example("South")
pth = libpysal.examples.get_path("south.shp")
df = read_file(pth)
plt.figure(dpi=200)
ax = df.plot(
column="HR60",
scheme="QUANTILES",
k=4,
cmap="BuPu",
legend=True,
legend_kwds={"loc": "center left", "bbox_to_anchor": (1, 0.5)},
)
结果展示:
测试basemap
代码来自官网:
- https://matplotlib.org/basemap/stable/users/examples.html
测试代码:
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
# set up orthographic map projection with
# perspective of satellite looking down at 45N, 100W.
# use low resolution coastlines.
map = Basemap(projection='ortho',lat_0=45,lon_0=-100,resolution='l')
# draw coastlines, country boundaries, fill continents.
map.drawcoastlines(linewidth=0.25)
map.drawcountries(linewidth=0.25)
map.fillcontinents(color='coral',lake_color='aqua')
# draw the edge of the map projection region (the projection limb)
map.drawmapboundary(fill_color='aqua')
# draw lat/lon grid lines every 30 degrees.
map.drawmeridians(np.arange(0,360,30))
map.drawparallels(np.arange(-90,90,30))
# make up some data on a regular lat/lon grid.
nlats = 73; nlons = 145; delta = 2.*np.pi/(nlons-1)
lats = (0.5*np.pi-delta*np.indices((nlats,nlons))[0,:,:])
lons = (delta*np.indices((nlats,nlons))[1,:,:])
wave = 0.75*(np.sin(2.*lats)**8*np.cos(4.*lons))
mean = 0.5*np.cos(2.*lats)*((np.sin(2.*lats))**2 + 2.)
# compute native map projection coordinates of lat/lon grid.
x, y = map(lons*180./np.pi, lats*180./np.pi)
# contour data over the map.
cs = map.contour(x,y,wave+mean,15,linewidths=1.5)
plt.title('contour lines over filled continent background')
plt.show()
测试结果:
总结
以上提供了一个关于海洋-气象专业中常用的python库的便捷安装方法,比如salem、geopandas、basemap,可以非常方便的处理不同虚拟环境的问题。
https://matplotlib.org/basemap/stable/users/geography.html
https://python-graph-gallery.com/281-basic-map-with-basemap/