LoginSignup
3
3

More than 1 year has passed since last update.

M1 Macでmatplotlib+cartopyの環境構築

Last updated at Posted at 2021-04-29

はじめに

気象データを Python を使って地図とともに可視化するためには、matplotlib と cartopy を使うことが一般的です。Intel Macでの環境構築については、「Intel Macでmatplotlib+cartopyの環境構築」という記事で既に解説しました。

ここではApple M1チップを搭載したMacでの環境構築について説明します。環境については以下の通りです。

  • OS: macOS Big Sur 11.2
  • チップ: Apple M1

Homebrew

まずはHomebrewのインストールから説明します。公式サイトにアクセスし、書かれているコマンドを実行します。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

こちらの環境では実行すると

Error: Fetching /opt/homebrew failed!
Failed during: /opt/homebrew/bin/brew update --force --quiet

というエラーメッセージが出ました。
しかし、~/.zshrcに以下のようにパスを設定し、source ~/.zshrcで読み込み直した後、brew updateするとエラーは出ないようなので、特に問題はなさそうです。

export PATH="/opt/homebrew/bin:$PATH"
export LD_LIBRARY_PATH="/opt/homebrew/lib:$LD_LIBRARY_PATH"

ここでPATHbrewコマンドを使うために必要になります。LD_LIBRARY_PATHが設定されていない場合、後にプログラムの実行時にライブラリが見つからずエラーになります。

バージョンは3.1.4がインストールされました。

$ brew --version
Homebrew 3.1.4
Homebrew/homebrew-core (git revision a469d3bb2a; last commit 2021-04-29)

バージョン3.0.0から公式にHomebrewがApple Siliconをサポートするようになりました(公式アナウンス)。今インストールされたのは、Rosetta 2を使わないM1ネイティブ対応版になります。Intel版との主な違いは、インストール先が/opt/homebrewに変更されたことと、まだM1未対応のformulaeが存在することです。

wgetをインストールして、ひとまず先に進みます。

brew install wget

Miniforge

Pythonのパッケージ管理や仮想環境の作成にはAnacondaやMinicondaがよく使われますが、これは残念ながらM1 Macには現在対応していません。その代わりに、Miniforgeと呼ばれるM1 Macに対応したディストリビューションを使います。基本的にMinicondaと同じように、condaコマンドが使えます。

公式ページにあるインストーラをダウンロードし実行します。

wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh
bash Miniforge3-MacOSX-arm64.sh

ちなみに、試していませんが、brew install miniforgeでもインストールできるようです。

Cartopy用の環境構築

ここではcartopy-envという名前の仮想環境をPython 3.9をベースに作成することにします。

conda create -n cartopy-env python=3.9
conda activate cartopy-env

Cartopy以外でよく使うパッケージをcondaで先にインストールしておきます。

conda install -c conda-forge numpy scipy xarray netcdf4 matplotlib 

Intel Macの場合は、conda install -c conda-forge cartopyでインストールできたわけですが、conda-forge の cartopy は osx-arm64 に対応していないため、condaコマンドではインストールできません。
そこでCartopyの公式サイトを参照しつつ、ソースからビルドすることになります。

まず、依存するパッケージを先にインストールします。

brew install proj geos
brew link proj
pip install --upgrade pyshp
pip install shapely --no-binary shapely

その後、pipでcartopyをインストールするのですが、環境変数CFLAGSでコンパイルオプションを指定しないと、エラーになります。

export CFLAGS="-I/opt/homebrew/include -L/opt/homebrew/lib"
pip install cartopy

この状態でPythonでimport cartopyをしてみると、ImportErrorが出ることがあります。

>>> import cartopy
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/homebrew/Caskroom/miniforge/base/envs/cartopy-env/lib/python3.9/site-packages/cartopy/__init__.py", line 96, in <module>
    import cartopy.crs
  File "/opt/homebrew/Caskroom/miniforge/base/envs/cartopy-env/lib/python3.9/site-packages/cartopy/crs.py", line 36, in <module>
    from cartopy._crs import (CRS, Geodetic, Globe, PROJ4_VERSION,
ImportError: dlopen(/opt/homebrew/Caskroom/miniforge/base/envs/cartopy-env/lib/python3.9/site-packages/cartopy/_crs.cpython-39-darwin.so, 2): Library not loaded: @rpath/libproj.22.dylib
  Referenced from: /opt/homebrew/Caskroom/miniforge/base/envs/cartopy-env/lib/python3.9/site-packages/cartopy/_crs.cpython-39-darwin.so
  Reason: image not found

/opt/homebrew/lib/を見てみると、libproj.19.dyliblibproj.dylibは見つかりますが、libproj.22.dylibがないようです。
同様のissueはすでに上がっており、対処方法として最も手っ取り早いのは/opt/homebrew/lib/libproj.22.dylibのシンボリックリンクを作成することです。

ln -s libproj.dylib libproj.22.dylib

最後に、以下のプログラムを実行し、日本付近の地図が描画されれば、正しくインストールされたことが確かめられます。

draw.py
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import cartopy.crs as ccrs
import cartopy.feature as cfeature

land_50m = cfeature.NaturalEarthFeature(
    'physical', 'land', '50m',
    edgecolor='face',
    facecolor=cfeature.COLORS['land'])

plt.figure()
ax = plt.axes(projection=ccrs.Mercator())
ax.set_extent([120, 150, 20, 50], ccrs.PlateCarree())
ax.add_feature(land_50m)
ax.coastlines(resolution='50m', lw=0.5)
ax.gridlines(xlocs=mticker.MultipleLocator(10),
            ylocs=mticker.MultipleLocator(10),
            linestyle='-',
            color='gray')
plt.savefig("mercator.png")

mercator.png

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3