[Python][Matplotlib] 等高線プロットcontourfで一部に色を塗らない

結論から言えば、色を塗りたくない場所にnp.nanを代入しておけばよい。

通常のcontourf

from itertools import product
import matplotlib.pyplot as plt
import numpy as np

X = np.linspace(0, 5, 20)
Y = np.linspace(0, 5, 20)
X, Y = np.meshgrid(X, Y)
Z0 = np.cos(1.5 * X) * np.cos(1.5 * Y)
fig = plt.figure()
ax = fig.add_subplot()
cs = ax.contourf(X, Y, Z0)
fig.colorbar(cs, ax=ax)
fig.savefig('test_Z0.jpg', dpi=600)
plt.close(fig)

f:id:cyanatlas:20200707013325j:plain

一部領域で色を塗らないcontourf

例えば右下( y < x)で色を塗らない場合。

from itertools import product
import matplotlib.pyplot as plt
import numpy as np

X = np.linspace(0, 5, 20)
Y = np.linspace(0, 5, 20)
Z0 = np.cos(1.5 * X) * np.cos(1.5 * Y)
Z1 = np.copy(Z0)
for yi, xi in product(range(Z1.shape[0]), range(Z1.shape[0])):
    if Y[yi] < X[xi]:
        Z1[yi][xi] = np.nan
    else:
        Z1[yi][xi] = np.cos(1.5 * X[xi]) * np.cos(1.5 * Y[yi])
fig = plt.figure()
ax = fig.add_subplot()
cs = ax.contourf(X, Y, Z1)
fig.colorbar(cs, ax=ax)
fig.savefig('test_Z1.jpg', dpi=600)
plt.close(fig)

f:id:cyanatlas:20200707013447j:plain

その他

corner_mask変数を使う方法もあるようだ。

matplotlib.org