[解決済み] 1つの図に複数の画像を正しく表示するには?重複
質問
1枚のFigureに20枚の画像をランダムに表示させようとしています。画像は確かに表示されますが、重なって表示されます。使っています。
import numpy as np
import matplotlib.pyplot as plt
w=10
h=10
fig=plt.figure()
for i in range(1,20):
img = np.random.randint(10, size=(h,w))
fig.add_subplot(i,2,1)
plt.imshow(img)
plt.show()
私は、それらがグリッドレイアウト(例えば4x5)で自然に表示され、それぞれが同じサイズであることを望みます。問題の一部は、add_subplotへの引数が何を意味するのか分からないことです。ドキュメントによると、引数は行数、列数、プロット番号です。位置決めの引数はありません。さらに、plot numberは1か2しかありません。どうすれば実現できるのでしょうか?
どのように解決するのですか?
ここでは、私の方法を紹介します。
import numpy as np
import matplotlib.pyplot as plt
w = 10
h = 10
fig = plt.figure(figsize=(8, 8))
columns = 4
rows = 5
for i in range(1, columns*rows +1):
img = np.random.randint(10, size=(h,w))
fig.add_subplot(rows, columns, i)
plt.imshow(img)
plt.show()
出来上がった画像。
(元の回答日時: Oct 7 '17 4:20)
編集1
この回答は私の予想を超えて人気があるので。そして、私は、個々のプロットの操作のための柔軟性を可能にするために、小さな変更が必要であることを理解しました。そこで、私はオリジナルのコードにこの新しいバージョンを提供します。 本質的に、それは以下を提供します。
- サブプロットの個々の軸へのアクセス
- 選択した軸/サブプロット上にさらに多くのフィーチャーをプロットする可能性
新しいコードです。
import numpy as np
import matplotlib.pyplot as plt
w = 10
h = 10
fig = plt.figure(figsize=(9, 13))
columns = 4
rows = 5
# prep (x,y) for extra plotting
xs = np.linspace(0, 2*np.pi, 60) # from 0 to 2pi
ys = np.abs(np.sin(xs)) # absolute of sine
# ax enables access to manipulate each of subplots
ax = []
for i in range(columns*rows):
img = np.random.randint(10, size=(h,w))
# create subplot and append to ax
ax.append( fig.add_subplot(rows, columns, i+1) )
ax[-1].set_title("ax:"+str(i)) # set title
plt.imshow(img, alpha=0.25)
# do extra plots on selected axes/subplots
# note: index starts with 0
ax[2].plot(xs, 3*ys)
ax[19].plot(ys**2, xs)
plt.show() # finally, render the plot
出来上がったプロット。
編集2
前の例では、コードは単一のインデックスでサブプロットにアクセスしますが、図が多くの行/列のサブプロットを持っている場合、これは不便です。ここでは、その代替案を示します。以下のコードは、サブプロットへのアクセスを
[row_index][column_index]
これは、多くのサブプロットの配列の操作に適している。
import matplotlib.pyplot as plt
import numpy as np
# settings
h, w = 10, 10 # for raster image
nrows, ncols = 5, 4 # array of sub-plots
figsize = [6, 8] # figure size, inches
# prep (x,y) for extra plotting on selected sub-plots
xs = np.linspace(0, 2*np.pi, 60) # from 0 to 2pi
ys = np.abs(np.sin(xs)) # absolute of sine
# create figure (fig), and array of axes (ax)
fig, ax = plt.subplots(nrows=nrows, ncols=ncols, figsize=figsize)
# plot simple raster image on each sub-plot
for i, axi in enumerate(ax.flat):
# i runs from 0 to (nrows*ncols-1)
# axi is equivalent with ax[rowid][colid]
img = np.random.randint(10, size=(h,w))
axi.imshow(img, alpha=0.25)
# get indices of row/column
rowid = i // ncols
colid = i % ncols
# write row/col indices as axes' title for identification
axi.set_title("Row:"+str(rowid)+", Col:"+str(colid))
# one can access the axes by ax[row_id][col_id]
# do additional plotting on ax[row_id][col_id] of your choice
ax[0][2].plot(xs, 3*ys, color='red', linewidth=3)
ax[4][3].plot(ys**2, xs, color='green', linewidth=3)
plt.tight_layout(True)
plt.show()
出来上がったプロット。
サブプロット配列の目盛り・ラベルの表示
すべてのサブプロットが同じ値の範囲を共有する場合、サブプロットに付随する目盛りと目盛りラベルのいくつかは、よりきれいなプロットを得るために隠すことができます。このプロットのように、左と下の外側の縁を除いて、すべての目盛りと目盛りラベルを隠すことができます。
左端と下端に共有ティックラベルだけを持つプロットを実現するには、次のようにします:-)
オプションを追加する
sharex=True, sharey=True
でfig, ax = plt.subplots()
その行は、こうなります。
fig,ax=plt.subplots(nrows=nrows,ncols=ncols,figsize=figsize,sharex=True,sharey=True)
必要な目盛りの数と、プロットするラベルを指定する。
の本文の中に
for i, axi in enumerate(ax.flat):
の中に、以下のコードを追加してください。
axi.xaxis.set_major_locator(plt.MaxNLocator(5))
axi.yaxis.set_major_locator(plt.MaxNLocator(4))
は5、4はプロットするtick/tick_labelsの数です。あなたのプロットに適した他の値が必要かもしれません。
関連
-
[解決済み】twinx と twiny を一緒に使う matplotlib (twinxy のようなもの)
-
[解決済み] matplotlib で swarm プロットを作成する方法
-
[解決済み] matplotlib でプロットをクリアするために cla()、clf() または close() をいつ使うか?
-
[解決済み] サブプロットで図の大きさを変えるには?
-
plt.fill_between 使用方法
-
[解決済み】Matplotlibで図のタイトルと軸ラベルのフォントサイズを設定するには?
-
[解決済み] Seaborn軸または図レベルプロットの図サイズを変更する方法
-
[解決済み] Matplotlib - サブプロット脇のグローバルな凡例とタイトル
-
[解決済み] matplotlib で、図の中のそれぞれのプロットされた線に新しい色を選択するには?
-
[解決済み] 1つの図に複数の画像を正しく表示するには?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】twinx と twiny を一緒に使う matplotlib (twinxy のようなもの)
-
TclError: 表示名がない、$DISPLAY環境変数の解決策もない。
-
[解決済み] pad_inches=0 と bbox_inches="tight" は、宣言された figsize よりも小さいプロットを作成します。
-
[解決済み] matplotlib でプロットをクリアするために cla()、clf() または close() をいつ使うか?
-
matplotlib のエラーです。TypeError: -でサポートされていないオペランドタイプ: 'str' および 'str'
-
plt.fill_between 使用方法
-
[解決済み] ipythonで表示せずにpylab.savefigを呼び出す。
-
[解決済み] Matplotlib - サブプロット脇のグローバルな凡例とタイトル
-
[解決済み] matplotlib で、図の中のそれぞれのプロットされた線に新しい色を選択するには?
-
[解決済み] デフォルトの線色サイクルを取得する