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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

Q&A

解決済

2回答

19659閲覧

fig, [ax] = plt.subplots(1, 1,figsize=(1,1))とすると、TypeError: 'AxesSubplot' object is not iterable

ruei

総合スコア284

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

0グッド

0クリップ

投稿2018/10/15 01:03

pythonのmatplotlibを利用してグラフを作っています。
以前、動画を二つ並べる方法を教えていただき、
そのコードを改造して、1つだけにしようとしたところで、つまずいています。
改造手出来たコードは下のようになっています。

import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from PIL import Image def update(time, ax): x = np.empty((100), float) y = np.empty((100), float) for i in range(100): x[i] = 2 * np.pi * i / 100 for i in range(100): y[i] = np.sin(x[i] + time * 0.1) ax.clear() ax.plot(x, y, color='black') fig, [ax] = plt.subplots(1, 1,figsize=(1,1)) anim = FuncAnimation(fig, update, fargs=(ax), interval=100, frames=100) anim.save('fig.gif', writer='imagemagick')

このコードを実行すると次のエラーが出ます。

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime' Traceback (most recent call last): File "test.py", line 17, in <module> fig, [ax] = plt.subplots(1, 1,figsize=(1,1)) TypeError: 'AxesSubplot' object is not iterable

原因・解決方法のわかる方、ご教授ください。

環境は次の通りです。

$ python Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56) [GCC 7.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import matplotlib >>> matplotlib.__version__ '2.2.2'

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

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

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

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

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

guest

回答2

0

subplots() の2番目の戻り値の仕様は

https://matplotlib.org/api/_as_gen/matplotlib.pyplot.subplots.html

ax can be either a single Axes object or an array of Axes objects if more than one subplot was created.

となっております。つまり

Python

1plt.subplots(1, 1,figsize=(1,1))

の場合、2番目の戻り値は Axesの配列ではなく、Axes Objectとなりますので、記述方法は

Python

1fig, ax = plt.subplots(1, 1, figsize=(1,1))

となるかと思います。

投稿2018/10/15 01:33

magichan

総合スコア15898

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

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

magichan

2018/10/15 01:37

被りましたね、すみません。
guest

0

ベストアンサー

問題点

2点問題点があります。

1. Axes が1つの場合の subplots() の返り値

nrows=1, ncols=1 のように図が1つのときは、[Axes] ではなく、Axes オブジェクトを返すので、
fig, [ax] = plt.subplots(figsize=(5, 5)) のように受けたらエラーになります。

エラーが出たときはまず公式リファレンスを確認することをおすすめします。

matplotlib.pyplot.subplots()

ax can be either a single Axes object or an array of Axes objects if more than one subplot was created.

ax は (1つの Axes を作成する場合は) 単一の Axes オブジェクト、2つ以上の Axes が作成する場合は Axes オブジェクトの配列になります。

ちなみに nrows=1, ncols=1 がデフォルト引数なので、Axes が1つのときは明示的に指定しなくてもよいです。

2. 要素が1つのタプルを作る場合はカンマが必要

要素が1つのタプルの場合、末尾にカンマが必要です。
カンマをつけない場合、(1)1 と同値になります。

python

1print(type((1))) # <class 'int'> 2print(type((1,))) # <class 'tuple'>

そのため、fargs=(ax) ではなく、fargs=(ax,) とします。

修正したコード

python

1import matplotlib.pyplot as plt 2import numpy as np 3from matplotlib.animation import FuncAnimation 4from PIL import Image 5 6def update(time, ax): 7 x = np.empty((100), float) 8 y = np.empty((100), float) 9 for i in range(100): 10 x[i] = 2 * np.pi * i / 100 11 12 for i in range(100): 13 y[i] = np.sin(x[i] + time * 0.1) 14 ax.clear() 15 ax.plot(x, y, color='black') 16 17fig, ax = plt.subplots(figsize=(5, 5)) 18anim = FuncAnimation(fig, update, fargs=(ax,), interval=100, frames=100) 19anim.save('fig.gif', writer='imagemagick')

投稿2018/10/15 01:21

編集2018/10/15 01:22
tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問