【matplotlib】pcolormeshで数値の範囲が大幅に異なる2種類のプロットを同時に表示する方法[Python]

  • URLをコピーしました!

matplotlib

前回、Jupyter NotebookのブラウザをGoogle Choromeに変更する方法を紹介しました。

今回はmatplotlibのpcolormeshで数値の範囲が大幅に異なる2種類のプロットを同時に表示する方法を紹介します。

それでは始めていきましょう。

データの準備

まず「大幅に異なる2種類のプロット」となるようなデータの作成をします。

一つの数値範囲として「0から1」、もう一つの範囲として「2から100」としてそれぞれを大体100に分割します(数値の調整のため大体にしています)。

それを結合し、1次元の数値のリストを作成し、その1次元のリストを100回繰り返して新たなリストに格納する事で2次元のリストとしました。

そのままではX軸方向への数値変化になってしまうので、「ndarray.T」とする事で転置をして、Y軸方向への数値変化としました。

そのデータをpcolormeshでカラープロット表示してみるとこんな感じになります。

import numpy as np
import matplotlib.pyplot as plt

data_small = np.linspace(0, 1, 101)
data_big = np.linspace(2, 100, 99)

one_data = np.concatenate([data_small, data_big])

data = []
for _ in range(100):
    data.append(one_data)

data = np.array(data).T

x_list = range(100)
y_list = range(len(one_data))

fig = plt.figure()
plt.clf()

plt.pcolormesh(x_list, y_list, data, shading="nearest")

plt.colorbar()

plt.show()

実行結果

Y軸方向に0から100までは数値として「0から1まで」の変化があるはずですが、それが全く反映されず、それ以降の大きな変化のみがプロットされています。

またカラープロットの範囲を「vmin」、「vmax」のオプション引数を使って値の小さい方に合わせると今度は大きな変化が見られなくなってしまいます。

import numpy as np
import matplotlib.pyplot as plt

data_small = np.linspace(0, 1, 101)
data_big = np.linspace(2, 100, 99)

one_data = np.concatenate([data_small, data_big])

data = []
for _ in range(100):
    data.append(one_data)

data = np.array(data).T

x_list = range(100)
y_list = range(len(one_data))

fig = plt.figure()
plt.clf()

plt.pcolormesh(x_list, y_list, data, shading="nearest", vmin=0, vmax=1)

plt.colorbar()

plt.show()

実行結果

今回は小さな変化も、大きな変化も同時に表示する方法を紹介します。

numpy.maのmasked_array

方法としてはnumpy.maのmasked_arrayを使います。

ちなみにmasked_arrayはこちらの記事でも紹介していますので、良かったらどうぞ。

具体的には元のデータから、ある境界(今回であれば1)で分けて、その上の値をマスクするデータとその下の値をマスクするデータと2つのデータを作成します。

そしてそれぞれをpcolormeshで表示します。

import numpy as np
from numpy.ma import masked_array

data_small = np.linspace(0, 1, 101)
data_big = np.linspace(2, 100, 99)

one_data = np.concatenate([data_small, data_big])

data = []
for _ in range(100):
    data.append(one_data)

data = np.array(data).T

data_low = masked_array(data, data >= 1)
data_high = masked_array(data, data < 1)

x_list = range(100)
y_list = range(len(one_data))

fig = plt.figure()
plt.clf()

plt.pcolormesh(x_list, y_list, data_low, cmap="Reds", shading="nearest", vmin=0, vmax=1)
plt.pcolormesh(x_list, y_list, data_high, cmap="Blues", shading="nearest", vmin=1, vmax=100)

plt.colorbar()

plt.show()

実行結果

このままではカラーバーが2から100のものしか表示されていません。

これを改善するには「plt.pcolormesh」の返り値を受け取り、それを「plt.colorbar」の引数にします。

つまり「x = plt.pcolormesh()」として、「plt.colorbar(x)」とするといった感じです。

import numpy as np
from numpy.ma import masked_array

data_small = np.linspace(0, 1, 101)
data_big = np.linspace(2, 100, 99)

one_data = np.concatenate([data_small, data_big])

data = []
for _ in range(100):
    data.append(one_data)

data = np.array(data).T

data_low = masked_array(data, data >= 1)
data_high = masked_array(data, data < 1)

x_list = range(100)
y_list = range(len(one_data))

fig = plt.figure()
plt.clf()

data1 = plt.pcolormesh(x_list, y_list, data_low, cmap="Reds", shading="nearest", vmin=0, vmax=1)
data2 = plt.pcolormesh(x_list, y_list, data_high, cmap="Blues", shading="nearest", vmin=1, vmax=100)

plt.colorbar(data1)
plt.colorbar(data2)

plt.show()

実行結果

次回は数値の桁数や小数点以下の桁数を数えたり、指数表示に変換する方法を紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする