【matplotlib】imshowとPathを使ってグラフをグラデーションで塗りつぶしたい【python】

この記事でグラフをグラデーションにするやり方を調べましたが、その時はfill_between関数を使って細切れに塗りつぶす方法でした。ただこのやり方だとx方向にしか色分けできず、もうちょっと自由に設定できるものはないかと調べたところimshowを使うパターンもあるようです。

chemstat.hatenablog.com

 

こまごまとした事はいったん置いておくとして、大雑把には以下のような流れで、背景をグラデーションにして、Pathの範囲内を切り出す、ということをやっています。

この辺は色々いじる方法がありそうなのでまたまとめようかと思います。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.patches import PathPatch

# データの作成
xx = np.arange(0, 11, 1)  # 0 から 10 までの整数を生成
yy = xx                   # xx と同じ値を yy に設定

# 最後尾の1点を追加
xx = np.append(xx, [10, 0])  # xx に [10, 0] を追加
yy = np.append(yy, [0, 0])   # yy に [0, 0] を追加

fig = plt.figure(figsize=(5, 5))  # 5x5 インチの図を作成
ax1 = fig.add_subplot(111)        # 1x1 グリッドの最初のサブプロットを作成

# パスの作成
path = Path(np.array([xx, yy]).transpose())  # xx と yy からパスを作成
patch = PathPatch(path, facecolor='none')    # パスからパッチを作成(塗りつぶしなし)
ax1.add_patch(patch)                         # サブプロットにパッチを追加

# 画像の表示
im = ax1.imshow(
    xx.reshape(yy.size, 1),                  # xx を2次元配列に変形して画像データとする
    cmap=plt.cm.Reds,                        # 赤色系のカラーマップを使用
    interpolation="bicubic",                 # バイキュービック補間で滑らかに表示
    origin='lower',                          # 画像の原点を下部に設定
    extent=[-5, 15, -5, 15],                 # 表示する軸の範囲を指定
    aspect="auto",                           # アスペクト比を自動に設定
    clip_path=patch,                         # パッチに沿って画像をクリップ
    clip_on=True                             # クリッピングを有効にする
)

# 軸の設定
ax1.set_xlim(-1, 11)  # x軸の表示範囲を -1 から 11 に設定
ax1.set_ylim(-1, 11)  # y軸の表示範囲を -1 から 11 に設定

fig.show()  # 図を表示

 

参考サイト

Filling between curves with color gradient or cmap in Matplotlib