回答編集履歴

1

tiitoi

tiitoi score 12997

2018/10/15 10:21  投稿

## 問題点
2点問題点があります。
### 1. Axes が1つの場合の subplots() の返り値
nrows=1, ncols=1 のように図が1つのときは、[Axes] ではなく、Axes オブジェクトを返すので、
`fig, [ax] = plt.subplots(figsize=(5, 5))` のように受けたらエラーになります。
エラーが出たときはまず公式リファレンスを確認することをおすすめします。
[matplotlib.pyplot.subplots()](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**.
> ax は (1つの Axes を作成する場合は) 単一の Axes オブジェクト、2つ以上の Axes が作成する場合は Axes オブジェクトの配列になります。
ちなみに `nrows=1, ncols=1` がデフォルト引数なので、Axes が1つのときは明示的に指定しなくてもよいです。
### 2. 要素が1つのタプルを作る場合はカンマが必要
要素が1つのタプルの場合、末尾にカンマが必要です。
カンマをつけない場合、`(1)` は `1` と同値になります。
```python
print(type((1))) # <class 'int'>
print(type((1,))) # <class 'tuple'>
```
そのため、`fargs=(ax)` ではなく、`fargs=(ax,)` とします。
## 修正したコード
```python
import matplotlib.pyplot as plt
import numpy as np
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(figsize=(5, 5))
anim = FuncAnimation(fig, update, fargs=(ax,), interval=100, frames=100)
anim.save('fig.gif', writer='imagemagick')
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る