web-dev-qa-db-ja.com

等しい軸スケール、Python、matplotlibでサブプロットを作成する

私は地震学データをプロットし、異なる深度スライスの16のサブプロットを特徴とする図を作成しています。各サブプロットは震源の緯度/経度を表示し、色はその大きさにスケーリングされます。私は2つのことをしようとしています:

  1. 選択した領域のxとyの最小値と最大値に等しくなるように、すべてのプロットのスケールを調整します。これにより、プロット間で簡単に比較できます。 (したがって、すべてのプロットはxminからxmaxなどの範囲になります)

  2. マグニチュードの色を調整して、スケールも表すようにします(つまり、色は、その特定のサブプロット上の点だけでなく、すべての利用可能な点を表します)。

これがいくつかの方法で達成されたことを確認しましたが、コードのループにそれらを適用するのに苦労しています。私が使用しているデータはここにあります: Data

コードを投稿し、現在の出力は以下のようになります。

import matplotlib.pyplot as plt
import pandas as pd

eq_df = pd.read_csv(eq_csv)
eq_data = eq_df[['LON', 'LAT', 'DEPTH', 'MAG']]
nbound = max(eq_data.LAT)
sbound = min(eq_data.LAT)
ebound = max(eq_data.LON)
wbound = min(eq_data.LON)

xlimit = (wbound, ebound)
ylimit = (sbound, nbound)

magmin = min(eq_data.MAG)
magmax = max(eq_data.MAG)

for n in list(range(1,17)):
    km = eq_data[(eq_data.DEPTH > n - 1) & (eq_data.DEPTH <= n)]
    plt.subplot(4, 4, n)
    plt.scatter(km["LON"], km['LAT'], s = 10, c = km['MAG'], vmin = magmin, vmax = magmax) #added vmin/vmax to scale my magnitude data
    plt.ylim(sbound, nbound) # set y limits of plot
    plt.xlim(wbound, ebound) # set x limits of plot
    plt.tick_params(axis='both', which='major', labelsize= 6)
    plt.subplots_adjust(hspace = 1)
    plt.gca().set_title('Depth = ' + str(n - 1) +'km to ' + str(n) + 'km', size = 8) #set title of subplots
    plt.suptitle('Magnitude of Events at Different Depth Slices, 1950 to Today')
plt.show()

Current Figure

ETA:問題を解決するための新しいコード

3
Richard

他の回答での このコメント への応答として、この使用例での_sharex=True_および_sharey=True_の使用のデモを次に示します。

_import matplotlib.pyplot as plt
import numpy as np

# Supply the limits since random data will be plotted
wbound = -0.1
ebound = 1.1
sbound = -0.1
nbound = 1.1

fig, axs = plt.subplots(nrows=4, ncols=4, figsize=(16,12), sharex=True, sharey=True)
plt.xlim(wbound, ebound)
plt.ylim(sbound, nbound)
for n, ax in enumerate(axs.flatten()):
    ax.scatter(np.random.random(20), np.random.random(20), 
               c = np.random.random(20), marker = '.')
    ticks = [n % 4 == 0, n > 12]
    ax.tick_params(left=ticks[0], bottom=ticks[1])
    ax.set_title('Depth = ' + str(n - 1) +'km to ' + str(n) + 'km', size = 12)

plt.suptitle('Magnitude of Events at Different Depth Slices, 1950 to Today', y = 0.95)
plt.subplots_adjust(wspace=0.05)
plt.show()
_

enter image description here

いくつかの説明:

  1. サブプロット間の水平間隔をsubplots_adjust(wspace=0.05)で減らしました
  2. _plt.suptitle_はループ内に存在する必要はありません(存在していてはいけません)。
  3. _ticks = [n % 4 == 0, n > 12]_は、各軸のboolsのペアを作成し、どの目盛りを描画するかを制御するために使用されます。
  4. 左目盛りと下目盛りはax.tick_params(left=ticks[0], bottom=ticks[1])で各軸に対して制御されます
  5. plt.xlim()およびplt.ylim()は、ループの前にonceを呼び出すだけで済みます
0
William Miller