質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

2090閲覧

plt.subplotを2回使えない。

ques346

総合スコア47

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/12 14:19

編集2021/06/13 03:20

python

1for i in range(len(out_img)): 2 plt.subplot(20, 20, i+1).imshow(out_img[i]) 3 4中略 5 6 # テスト 7 scoreboard = [] 8 for i in range(len(training_data_list)): 9 idata = (np.array(training_data_list[i][1:]) / 255.0 * 0.99) + 0.01 10 predict = nn.feedforward(idata) 11 plabel = np.argmax(predict) 12 print("plabel" ,plabel) 13 #修正値plabelにimg値を修正する。 14 out_img[i] = out_img[plabel] 15 pass 16 scoreboard_array = np.asarray(scoreboard) 17 print('performance: ', scoreboard_array.sum() / scoreboard_array.size) 18 19中略 20 21 22for i in range(len(out_img)): 23 plt.subplot(20, 20, i+1).imshow(out_img[i])

とすると、下の画像の集まりしか表示されないのですが、
plt.subplotは、2つ書くと最後の方が優先されるのでしょうか?
両方表示するにはどうすればいいんでしょうか。

コード全体は以下です。

python

1from google.colab import drive 2drive.mount('/content/drive') 3 4import sys 5import numpy as np 6import matplotlib.pyplot as plt 7 8sys.path.append('/content/drive/My Drive') 9 10import ActivationFunction as AF 11 12from PIL import Image 13from IPython.display import display 14 15img = Image.open("drive/My Drive/mnist_dataset/rei.jpeg") 16img = img.resize((100, 100)) 17img = np.asarray(img) 18 19plt.imshow(img) 20 21size = 5 22 23v_split = img.shape[0] // size 24h_split = img.shape[1] // size 25out_img = [] 26[out_img.extend(np.hsplit(h_img, h_split)) 27 for h_img in np.vsplit(img, v_split)] 28 29plt.figure(figsize=(100,100)) 30 31# imgの画像を表示 元は20,20,i+1... 32# for i in range(len(out_img)): 33# plt.subplot(20, 20, i+1).imshow(out_img[i]) 34 35def extract(x, y): 36 # カラー画像の時Gだけ抜き取りたい 37 if len(x.shape) == 3: 38 h, w, ch = x.shape 39 40 # RGBのGだけ抜き取りたい 41 return x[:,:,y] 42 43# v_max, v_min = 300, 200から変更 44v_max, v_min = 255, 250 45 46def diff(x): 47 imgrows, lenrows, imgcolumns, lencolumns = [], [], [], [] 48 for (img, imgt) in zip(x, x.T): 49 rows = img[(v_min<img)&(v_max>img)] 50 columns = imgt[(v_min<imgt)&(v_max>imgt)] 51 imgrows.append(rows) 52 lenrows.append(len(rows)) 53 imgcolumns.append(columns) 54 lencolumns.append(len(columns)) 55 return lenrows + lencolumns 56 57np.set_printoptions(threshold=10000) 58print(type(extract(out_img[i], 1))) 59print(type(diff(extract(out_img[i], 1)))) 60print(type(out_img[0][0])) 61 62# 見本データに対しても同様に 63# exについて同様に 64training_data_list = [] 65 66for i in range(len(out_img)): 67 #g #b #r 抽出後diffしてappend 68 training_data_list.append([i] + diff(extract(out_img[i], 1)) + diff(extract(out_img[i], 2)) + diff(extract(out_img[i], 0))) # 略 69 70# 3層ニューラルネットワーク 71class ThreeLayerNetwork: 72 # コンストラクタ 73 def __init__(self, inodes, hnodes, onodes, lr): 74 # 各レイヤーのノード数 75 self.inodes = inodes 76 self.hnodes = hnodes 77 self.onodes = onodes 78 79 # 学習率 80 self.lr = lr 81 82 # 重みの初期化 83 self.w_ih = np.random.normal(0.0, 1.0, (self.hnodes, self.inodes)) 84 self.w_ho = np.random.normal(0.0, 1.0, (self.onodes, self.hnodes)) 85 86 # 活性化関数 87 self.af = AF.sigmoid 88 self.daf = AF.derivative_sigmoid 89 90 # 誤差逆伝搬 91 def backprop(self, idata, tdata): 92 93 # 縦ベクトルに変換 94 o_i = np.array(idata, ndmin=2).T 95 t = np.array(tdata, ndmin=2).T 96 97 # 隠れ層 98 x_h = np.dot(self.w_ih, o_i) 99 o_h = self.af(x_h) 100 101 # 出力層 102 x_o = np.dot(self.w_ho, o_h) 103 o_o = self.af(x_o) 104 105 # 誤差計算 106 e_o = (t - o_o) 107 e_h = np.dot(self.w_ho.T, e_o) 108 109 # 重みの更新 110 self.w_ho += self.lr * np.dot((e_o * self.daf(o_o)), o_h.T) 111 self.w_ih += self.lr * np.dot((e_h * self.daf(o_h)), o_i.T) 112 113 114 # 順伝搬 115 def feedforward(self, idata): 116 # 入力のリストを縦ベクトルに変換 117 o_i = np.array(idata, ndmin=2).T 118 119 # 隠れ層 120 x_h = np.dot(self.w_ih, o_i) 121 o_h = self.af(x_h) 122 123 # 出力層 124 x_o = np.dot(self.w_ho, o_h) 125 o_o = self.af(x_o) 126 127 return o_o 128 129if __name__=='__main__': 130 # パラメータ 131 #inodes=784から30に変更 132 inodes = 30 133 hnodes = 100 134 onodes = len(training_data_list) 135 lr = 0.3 136 137 # ニューラルネットワークの初期化 138 nn = ThreeLayerNetwork(inodes, hnodes, onodes, lr) 139 140 # 学習 141 epoch = 50 142 for e in range(epoch): 143 data_size = len(training_data_list) 144 for i in range(data_size): 145 idata = (np.array(training_data_list[i][1:]) / 255.0 * 0.99) + 0.01 146 # 変更の余地あり 147 tdata = np.zeros(onodes) + 0.01 148 tdata[training_data_list[i][0]] = 0.99 149 nn.backprop(idata, tdata) 150 pass 151 pass 152 153 # テスト 154 scoreboard = [] 155 for i in range(len(training_data_list)): 156 idata = (np.array(training_data_list[i][1:]) / 255.0 * 0.99) + 0.01 157 predict = nn.feedforward(idata) 158 plabel = np.argmax(predict) 159 print("plabel" ,plabel) 160 #修正値plabelにimg値を修正する。 161 out_img[i] = out_img[plabel] 162 pass 163 scoreboard_array = np.asarray(scoreboard) 164 print('performance: ', scoreboard_array.sum() / scoreboard_array.size) 165 166 167# imgの値を修正し、かつ修正した画像を表示 元は20,20,i+1... 168for i in range(len(out_img)): 169 plt.subplot(20, 20, i+1).imshow(out_img[i])

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fukatani

2021/06/12 14:24

質問のタイトルと内容が乖離しているので、 matplotlibで複数のグラフを表示したいとかに直したほうが良さそうです。
teamikl

2021/06/13 02:52

上と下のコードで同じ画像を同じ場所に配置してますが、間に他のコードはないのでしょうか。 同じ場所に2つ同じ画像を表示したいということですか?
ques346

2021/06/13 03:08

追記しました 上と下に別々に、重ねず表示したいです。
guest

回答4

0

ベストアンサー

python

1plt.figure(figsize=(100,100)) 2for i in range(len(out_img)): 3 plt.subplot(20, 20, i+1).imshow(out_img[i]) 4 5中略 6 7plt.figure(figsize=(100,100)) 8for i in range(len(out_img)): 9 plt.subplot(20, 20, i+1).imshow(out_img[i])

投稿2021/06/13 10:41

jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ques346

2021/06/14 04:12 編集

お、、できました。 ありがとうございます、更にですが、 今forの塊を2つ作っていますが、 この塊2つが、互いに上下隣接して表示されており、境目が分かりにくい状態で、 この境が明確になるよう、改行等を入れる適切な方法はありますでしょうか? (たとえば、print("----")等としても、上に-----と表示さ、画像はやはり隣接したままになります。
jbpb0

2021/06/16 04:18

> この境が明確に 二つ目の plt.figure(figsize=(100,100)) のすぐ上に下記を挿入 plt.figure(figsize=(100,10)) plt.plot() plt.axis('off') 100,10の10を大きくすると隙間が広がる
guest

0

原因は、同じ場所に配置してる為です。
MatplotlibDeprecationWarning という警告は出てませんか?
将来のバージョンでは挙動が変わるような事が書かれてます。

繰り返しについては、enumerateを使い以下のように記述できます。

python

1for i, img in enumerate(out_img, start=1): 2 plt.subplot(20, 20, i).imshow(img)

上下に並べるのは、2通り案があり

  • 画像を連結してから配置する
  • 配置する場所を、列が交互になるように工夫する

後者について考え方だけ振れておくと

python

1# 3x3 2[1, 2, 3, 3 4, 5, 6, 4 7, 8, 9] 5 6# 画像リストの順序について 7# 上下に並べるために、以下のように配置する 8 9# 3x6 10[1, 2, 3, 11 1, 2, 3, 12 4, 5, 6, 13 4, 5, 6, 14 7, 8, 9, 15 7, 8, 9]

3x3 での例。画像の代わりに range(10)

python

1from itertools import chain, zip_longest 2 3def chunk(xs, count): 4 """ 5 >>> list(chunk(range(10), 3)) 6 [(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, None, None)] 7 """ 8 return zip_longest(*[iter(xs)]*count) 9 10out_imgA = range(10) # 実際は image のリスト 11out_imgB = range(10) # 上書きせずに別リストを作る 12xsA = chunk(out_imgA, 3) # 実際の値: 20 13xsB = chunk(out_imgB, 3) # 行毎に分割 14flatten = chain(*chain(*zip(xsA, xsB))) # 2つのリストを行毎に掛け合わせてから平坦化 15 16for i, img in enumerate(flatten, start=1): 17 if img is not None: 18 print(f"{i:02} {img}") # plt.subplot(40, 20, i).imshow(img) 19

python

1import math 2 3def grid_list(ncol, listA, listB): 4 assert len(listA) == len(listB) 5 6 iterA = iter(listA) 7 iterB = iter(listB) 8 nrow = math.ceil(len(listA) / ncol) 9 10 for _ in range(nrow): 11 # 加工前のリストから1行読み出し 12 for _ in range(ncol): 13 yield next(iterA, None) 14 15 # 加工後のリストから1行読み出し 16 for _ in range(ncol): 17 yield next(iterB, None) 18 19out_imgA = list(range(10)) 20out_imgB = list(range(10)) 21 22for i, img in enumerate(grid_list(3, out_imgA, out_imgB), start=1): 23 if img is not None: 24 print(f"{i:02} {img}") 25

追記: 上下を交互ではなく別ける場合。enumerateの引数で配置位置を調整

python

1for i, img in enumerate(out_img, start=1): 2 plt.subplot(40, 20, i).imshow(img) 3 4... 5 6for i, img in enumerate(out_img, start=20*20+1): 7 plt.subplot(40, 20, i).imshow(img)

投稿2021/06/13 04:07

編集2021/06/13 11:21
teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こちらループの添字(i)のほうは初期化してますでしょうか?
上記の場合、二回目のループはすぐ抜けてしまうように思います。

投稿2021/06/12 14:27

m2l

総合スコア318

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fukatani

2021/06/12 14:32

pythonのループとしてはこれであってます。rangeがゼロから始まってくれます。
m2l

2021/06/12 14:35

大変失礼致しました。 後は二回目のループが同じ場所にプロットされているようなので、ずらしたほうが良いかなと思います。 plt.subplot(20, 20, i+1+前に回したループのmax).imshow(out_img[i])
ques346

2021/06/12 18:58 編集

まずi+1の最大値で、400になってしまうようで、 これ以上増やすと、20*20に収まらずoverになります。 他にも色々試しましたがよく分からないエラーが出ます。
m2l

2021/06/12 20:56

ご返信ありがとうございます。 ちなみに一つのfigure内に絶対に収めたい形でしょうか? plt.figure()をそれぞれの処理の前に定義してそれぞれ生成する形はいかがでしょうか?
ques346

2021/06/13 01:56

それでできるならそれでも。 それでやろうとしたのですが、上手くいかず。
m2l

2021/06/13 02:02

上手く行かない形なのですね。。 エラーとかは出ておりますか?
ques346

2021/06/13 02:42

たぶんエラー以前にこちらのやり方が違うかと。 fig、subplot、ax?の組み合わせ方がよく分からない。 またforで塊を作っている所も少しややこしくしているのかも。
m2l

2021/06/13 02:45

そうなんですね。 ちなみにデータ分析をされたいとは思うのですが、どのようなデータから何を実現(可視化)したくプロットされているのでしょうか?
ques346

2021/06/13 03:03

jpeg画像データから、類似画像同士をまとめて同じ画像にしたくて、です。 元画像 ↓ 類似まとめ処理画像 ↓ 更に処理。。みたいな
m2l

2021/06/13 03:06

ありがとうございます。 画像を分類していきたい形ですね。 同じ画像にするというのは類似画像を集めてそれぞれの座標にある色素の平均値などから打ち出していくような形でしょうか?
m2l

2021/06/13 03:07

それとも一覧表示していけば良い形ですかね??
ques346

2021/06/13 03:08

そんな感じ(平均)ですね。
m2l

2021/06/13 03:10

ありがとうございます。 平均値ですね。 全体感見れると非常に助かりますので該当のコードを質問編集してご連携いただけますでしょうか?
guest

0

https://3pysci.com/python-matplotlib-12/
このページの通りにやれば複数表示できます。

投稿2021/06/12 14:23

fukatani

総合スコア626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ques346

2021/06/12 16:26

それちょっとやってみたんですが、自分の場合forで大量に画像を貼りつける操作を、2回行ってるためか、上手くいかないんですよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問