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

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

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

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

Q&A

1回答

2266閲覧

python エラー'list' object has no attribute 'get_zorder'について

burro

総合スコア12

Python

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

0グッド

0クリップ

投稿2021/01/08 09:38

前提・実現したいこと

pythonでアニメーションを用いた捕食者被食者増減シミュレーションをしています。
'list' object has no attribute 'get_zorder'というエラーが出てしまったのですが、初心者でどう修正すれば良いかわからないので教えていただければ幸いです。

シミュレーションの設定は以下の通りです

被食者:トウヒノシントメハマキ(青)
S秒につき(その時点にいるトウヒノシンノメハマキの数)×1匹増加する
誕生からK秒経過した個体は死亡する
ランダムに移動する

捕食者:トウヒノシントメハマキを捕食する任意の虫(赤)
捕食者の一定距離(R)に入るとトウヒノシンノメハマキは捕食される
餌(トウヒノシントメハマキ)を一匹食べるごとに一匹増加する
ランダムに移動する
誕生からK秒経過した個体は死ぬ

尚、S,N,R,Kは実験によって数値を変える

初期被食者個体数はM、初期捕食者数はmとする

発生している問題・エラーメッセージ

'list' object has no attribute 'get_zorder'

該当のソースコード

# 必要なライブラリのインポート import matplotlib matplotlib.use('nbagg') import random import numpy as np import matplotlib.pyplot as plt from matplotlib import animation, rc from IPython.display import HTML # 定数 N = 200 R = 0.5 # 近隣を規定する数値 S = 10 #被食者が増加する時間 K = 15 #被食者捕食者が誕生してから死亡するまでの秒数 M = 50 #初期被食者数 m = 10 #初期捕食者数 # パラメータの設定 t_span = [0, 20] # 観測時間 dt = 0.2 # 観測間隔 # Agentクラス class Agent: # コンストラクタ def __init__(self, cat): self.category = cat self.x = random.uniform(-10,10) self.y = random.uniform(-10,10) # 次時刻の状態の計算 def calcnext(self): if self.category == 0: self.cat0() elif self.category == 1: self.cat1() elif self.category == 2: self.cat2() else: print("ERROR カテゴリがありません\n") # カテゴリ0の計算メソッド(被食者) def cat0(self): self.x += (random.random() - 0.5) * 2 self.y += (random.random() - 0.5) * 2 # カテゴリ1の計算メソッド(捕食者) def cat1(self): self.x += (random.random() - 0.5)*2 self.y += (random.random() - 0.5)*2 #カテゴリー2の計算メゾット(スタンバイ) def cat2(self): self.x += (random.random() - 0.5)*2 self.y += (random.random() - 0.5)*2 # 時間ごとの状態遷移 def state_transition(t_span, dt, a): x, y, cats, birth, death = [[] for i in range(N)], [[] for i in range(N)], [[] for i in range(N)],[0 for i in range(N)],[0 for i in range(N)] t = np.arange(t_span[0], t_span[1], dt) count_birth = 0 for i in range(len(t)): for j in range(len(a)): # 次周期の状態の計算 a[j].calcnext() # エージェントごとに時刻iの座標とカテゴリを追記する x[j].append(a[j].x) y[j].append(a[j].y) cats[j].append(a[j].category) if a[j].category == 0: if birth[j] < S: birth[j] += 1 elif birth[j] >= S: birth[j] = 0 for l in range(len(a)): if a[l].category == 2: a[l].category = 0 break if death[j] < K: death[j] += 1 elif death[j] >= K: death[j] =0 a[j].category = 2 # カテゴリ1のエージェントとの距離がRより小さいとき,カテゴリ1に変わる elif a[j].category == 1: for k in range(len(a)): if ((a[k].x - a[j].x) * (a[k].x - a[j].x) + (a[k].y - a[j].y) * (a[k].y - a[j].y)) < R: a[k].category = 1 if death[k] < K: death[k] += 1 elif death[k] >= K: death[k] =0 a[j].category = 2 return t, x, y, cats # アニメーションの一ステップごとの処理 def one_step(j, x, y, cats): for i in range(N): dots[i].set_data(x[i][j], y[i][j]) if cats[i][j] == 0: dots[i].set_color('blue') elif cats[i][j] == 1: dots[i].set_color('red') return dots, # 見た目の設定 def draw(): fig, ax = plt.subplots() plt.close() dots = [] for i in range(N): dot, = ax.plot([], [], c='white', marker='.') dots.append(dot) ax.set_xlim(-20, 20) ax.set_ylim(-20, 20) ax.set_aspect('equal') ax.axes.xaxis.set_visible(False) ax.axes.yaxis.set_visible(False) return fig, dots # Agentの生成 a = [Agent(2) for i in range(N-M-m)] #白 a.extend([Agent(0) for i in range(M)])#青 a.extend([Agent(1) for i in range(m)])#赤 # 時間発展 t, x, y, cats = state_transition(t_span, dt, a) count0 = 0 count1 = 0 for i in range(N): if a[i].category == 0: count0 += 1 elif a[i].category == 1: count1 += 1 print("最終個体数\n") print("被食者",count0,"匹\n捕食者",count1,"匹") # アニメーションの描画 fig, dots = draw() ani = animation.FuncAnimation(fig, one_step, fargs=(x, y, cats), frames=np.arange(0, len(t)), interval=300, blit=True) # colabでアニメーションを動かすためのコード rc('animation', html='jshtml') ani

試したこと

補足情報(FW/ツールのバージョンなど)

google colaboratoryを使用しています

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

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

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

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

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

guest

回答1

0

'list' object has no attribute 'get_zorder'

このエラーの意味は、
listオブジェクトにはget_zorderというアトリビュートはありません
ということです。

そこんところの変数の中にはなにがはいってるか確認してみよう。

#提示のコードには当該エラーの場所がないようですが、追記してみてください

投稿2021/01/08 10:17

y_waiwai

総合スコア87800

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

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

burro

2021/01/08 10:22

回答ありがとうございます エラーにどこのリストなのかが出ずわからずにいます...コード自体はこれで全部です 以下がエラー全文になります 最終個体数 被食者 0 匹 捕食者 85 匹 Traceback (most recent call last): File "/usr/local/lib/python3.6/dist-packages/matplotlib/cbook/__init__.py", line 196, in process func(*args, **kwargs) File "/usr/local/lib/python3.6/dist-packages/matplotlib/animation.py", line 951, in _start self._init_draw() File "/usr/local/lib/python3.6/dist-packages/matplotlib/animation.py", line 1743, in _init_draw self._draw_frame(next(self.new_frame_seq())) File "/usr/local/lib/python3.6/dist-packages/matplotlib/animation.py", line 1772, in _draw_frame key=lambda x: x.get_zorder()) File "/usr/local/lib/python3.6/dist-packages/matplotlib/animation.py", line 1772, in <lambda> key=lambda x: x.get_zorder()) AttributeError: 'list' object has no attribute 'get_zorder' --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) /usr/local/lib/python3.6/dist-packages/IPython/core/formatters.py in __call__(self, obj) 336 method = get_real_method(obj, self.print_method) 337 if method is not None: --> 338 return method() 339 return None 340 else: 5 frames /usr/local/lib/python3.6/dist-packages/matplotlib/animation.py in _repr_html_(self) 1391 return self.to_html5_video() 1392 elif fmt == 'jshtml': -> 1393 return self.to_jshtml() 1394 1395 /usr/local/lib/python3.6/dist-packages/matplotlib/animation.py in to_jshtml(self, fps, embed_frames, default_mode) 1380 embed_frames=embed_frames, 1381 default_mode=default_mode) -> 1382 self.save(str(path), writer=writer) 1383 self._html_representation = path.read_text() 1384 /usr/local/lib/python3.6/dist-packages/matplotlib/animation.py in save(self, filename, writer, fps, dpi, codec, bitrate, extra_args, metadata, extra_anim, savefig_kwargs, progress_callback) 1133 for anim in all_anim: 1134 # Clear the initial frame -> 1135 anim._init_draw() 1136 frame_number = 0 1137 # TODO: Currently only FuncAnimation has a save_count /usr/local/lib/python3.6/dist-packages/matplotlib/animation.py in _init_draw(self) 1741 # artists. 1742 if self._init_func is None: -> 1743 self._draw_frame(next(self.new_frame_seq())) 1744 1745 else: /usr/local/lib/python3.6/dist-packages/matplotlib/animation.py in _draw_frame(self, framedata) 1770 'sequence of Artist objects.') 1771 self._drawn_artists = sorted(self._drawn_artists, -> 1772 key=lambda x: x.get_zorder()) 1773 1774 for a in self._drawn_artists: /usr/local/lib/python3.6/dist-packages/matplotlib/animation.py in <lambda>(x) 1770 'sequence of Artist objects.') 1771 self._drawn_artists = sorted(self._drawn_artists, -> 1772 key=lambda x: x.get_zorder()) 1773 1774 for a in self._drawn_artists: AttributeError: 'list' object has no attribute 'get_zorder' SEARCH STACK OVERFLOW
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問