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

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

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

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

Python

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

Q&A

解決済

1回答

3723閲覧

matplotlib の plot_surface で AttributeError: 'NoneType' object has no attribute 'ndim' というエラーが出る

ShibaSamo

総合スコア15

Matplotlib

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

Python

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

0グッド

0クリップ

投稿2022/01/07 15:29

前提・実現したいこと

python3.6を使ってFDTD法の計算結果を描画したいと考えています。
しかし、計算自体は行えたのですが、描画をする際にエラーが出ます。
エラーコードを読むに、Main FDTD Loopの中の計算には問題がなく、その後のmatplotlibの部分に問題があると思うのですが、どうにもできず途方に暮れています。
ソースコードの
gaz_arrange.txt
gbz_arrange.txt
は、200x200の配列(?)を入れたテキストファイルです。
ie,je,ia,ibなどは全て整数値です。

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

C:\Users\USER\python\FDTD\ELECTROMAGNETIC SIMULATION USING THE FDTD> python fd2d _main.py 100%|███████████████████████████████████████| 194/194 [00:01<00:00, 135.79it/s] 100%|████████████████████████████████████████| 300/300 [03:47<00:00, 1.32it/s] Traceback (most recent call last): File "fd2d_main.py", line 123, in <module> plot_e_field(ax, plotting_point[ 'data_to_plot'], plotting_point[ 'num_step s'], plotting_point['label']) File "fd2d_main.py", line 105, in plot_e_field ax.plot_surface(Y, X, data, rstride=1, cstride=1, color='white', edgecolor ='black', linewidth=.25) File "C:\Users\USER\AppData\Local\Programs\Python\Python36\lib\site-packages\m pl_toolkits\mplot3d\axes3d.py", line 1555, in plot_surface if Z.ndim != 2: AttributeError: 'NoneType' object has no attribute 'ndim'

該当のソースコード

python3.6

1 2#!/usr/bin/env python 3# -*- coding: utf-8 -*- 4 5""" 6fd2d メインのプログラム 7""" 8 9import numpy as np 10import scipy.constants as sc 11from math import pi, sin, cos 12from matplotlib import pyplot as plt 13from mpl_toolkits.mplot3d.axes3d import Axes3D, get_test_data 14from tqdm import tqdm 15 16import fd2d_scatter_arrange as fs 17import fd2d_init_value as fi 18 19 20# 誘電体の配置の読み込み 21gaz = np.loadtxt('gaz_arrange.txt') 22gbz = np.loadtxt('gbz_arrange.txt') 23 24# Dictionary to keep track of desired points for plotting 25plotting_points = [{'label': 'a','num_steps':4700, 'data_to_plot':None}, {'label':'b', 'num_steps':4800, 'data_to_plot':None}, { 'label':'c' ,'num_steps':4900, 'data_to_plot':None}, {'label':'d', 'num_steps':5000, 'data_to_plot':None}, ] 26 27# Main FDTD Loop 28for time_step in tqdm( range(1, fi.nsteps + 1) ): 29 30 # Incident Ez values 31 for j in range(1, fi.je): 32 fi.ez_inc[j] = fi.ez_inc[j] + 0.5 * (fi.hx_inc[j - 1] - fi.hx_inc[j]) 33 34 # Absorbing Boundary Conditions 35 fi.ez_inc[0] = fi.boundary_low.pop(0) 36 fi.boundary_low.append(fi.ez_inc[1]) 37 fi.ez_inc[fi.je - 1] = fi.boundary_high.pop(0) 38 fi.boundary_high.append(fi.ez_inc[fi.je - 2]) 39 40 # Calculate the Dz field 41 for j in range(1, fi.je): 42 for i in range(1, fi.ie): 43 fi.dz[i, j] = fi.gi3[i] * fi.gj3[j] * fi.dz[i, j] + fi.gi2[i] * fi.gj2[j] * 0.5 * (fi.hy[i, j] - fi.hy[i - 1, j] - fi.hx[i, j] + fi.hx[i, j - 1]) 44 45 # Source 46 pulse = sin(2 * pi * fi.freq * fi.dt * (fi.t0 - time_step)) 47 fi.ez_inc[3] = pulse 48 49 # Incident Dz values 50 for i in range(fi.ia, fi.ib): 51 fi.dz[i, fi.ja] = fi.dz[i, fi.ja] + 0.5 * fi.hx_inc[fi.ja - 1 ] 52 fi.dz[i, fi.jb] = fi.dz[i, fi.jb] - 0.5 * fi.hx_inc[fi.jb - 1 ] 53 54 # Calculate the Ez field 55 for j in range(0, fi.je): 56 for i in range(0, fi.ie): 57 fi.ez[i, j] = gaz[i, j] * (fi.dz[i, j] - fi.iz[i,j]) 58 fi.iz[i, j] = fi.iz[i, j] + gbz[i, j] * fi.ez[i,j] 59 60 # Calculate the Incident Hx 61 for j in range(0, fi.je - 1): 62 fi.hx_inc[j] = fi.hx_inc[j] + 0.5 * (fi.ez_inc[j] - fi.ez_inc[j + 1]) 63 64 # Calculate the Hx field 65 for j in range(0, fi.je - 1): 66 for i in range(0, fi.ie - 1): 67 curl_e = fi.ez[i, j] - fi.ez[i, j + 1] 68 fi.ihx[i, j] = fi.ihx[i, j] + curl_e 69 fi.hx[i, j] = fi.fj3[j] * fi.hx[i, j] + fi.fj2[j] * (0.5 * curl_e + fi.fil[i] * fi.ihx[i,j]) 70 71 # Incident Hx values 72 for i in range(fi.ia, fi.ib): 73 fi.hx[i, fi.ja - 1] = fi.hx[i, fi.ja - 1] + 0.5 * fi.ez_inc[fi.ja] 74 fi.hx[i, fi.jb] = fi.hx[i, fi.jb] - 0.5 * fi.ez_inc[fi.jb] 75 76 # Calculate the Hy field 77 for j in range(0, fi.je - 1): 78 for i in range(0, fi.ie - 1): 79 curl_e = fi.ez[i, j] - fi.ez[i + 1, j] 80 fi.ihy[i, j] = fi.ihy[i, j] + curl_e 81 fi.hy[i, j] = fi.fi3[i] * fi.hy[i, j] - fi.fi2[i] * (0.5 * curl_e + fi.fjl[j] * fi.ihy[i,j]) 82 83 # Incident Hy values 84 for j in range(fi.ja, fi.jb): 85 fi.hy[fi.ia - 1, j] = fi.hy[fi.ia - 1, j] - 0.5 * fi.ez_inc[j] 86 fi.hy[fi.ib - 1, j] = fi.hy[fi.ib - 1, j] + 0.5 * fi.ez_inc[j] 87 88 # Save data at certain points for later plotting 89 for plotting_point in plotting_points: 90 if time_step == plotting_point['num_steps']: 91 plotting_point['data_to_plot'] = np.copy(fi.ez) 92 93 94# Plot Fig 95plt.rcParams['font.size']= 12 96plt.rcParams['grid.color']= 'gray' 97plt.rcParams['grid.linestyle'] = 'dotted' 98fig = plt.figure(figsize=(8, 8)) 99 100X, Y = np.meshgrid(range(fi.je), range(fi.ie)) 101 102def plot_e_field(ax, data, timestep, label): 103 """3d Plot of E field at a single timestep""" 104 ax.set_zlim(-0.5, 1) 105 ax.view_init(elev=15, azim=25) 106 ax.plot_surface(Y, X, np.array(data), rstride=1, cstride=1, color='white', edgecolor='black', linewidth=.25) 107 ax.zaxis.set_rotate_label(False) 108 ax.set_zlabel(r' $E_{Z}$', rotation=90, labelpad=10, fontsize=14) 109 ax.set_zticks([-0.5, 0, 0.5, 1]) 110 ax.set_xlabel('cm') 111 ax.set_ylabel('cm') 112 ax.set_xticks(np.arange(0, 200, step=50)) 113 ax.set_yticks(np.arange(0, 200, step=50)) 114 ax.text2D( 0.25, 0.3, "T = {}".format(timestep) , transform=ax.transAxes) 115 ax.xaxis.pane.fill = ax.yaxis.pane.fill = ax.zaxis.pane.fill = False 116 plt.gca().patch.set_facecolor( 'white') 117 ax.text2D(-0.05, 0.8, "( {} ) ".format(label), transform=ax.transAxes) 118 ax.dist = 11 119 120 121# Plot the E field at each of the four time steps saved earlier 122for subplot_num, plotting_point in enumerate(plotting_points): 123 ax = fig.add_subplot(2, 2, subplot_num + 1, projection='3d' ) 124 plot_e_field(ax, plotting_point[ 'data_to_plot'], plotting_point[ 'num_steps'], plotting_point['label']) 125 126fig.tight_layout() 127plt.savefig("image.png") 128plt.show() 129 130

試したこと

plot_surfaceの最初の引数3つの内に問題があると思い、dataをNumpy配列にしてみたのですが駄目でした。
また、コードを書いた当初は問題なく実行できていたのですが、zticksとxticks、yticksの値を変更した後にエラーが出るようになりました。
この部分に問題があるのかと値を戻したところ、エラーのみが残ってしまいました。
元々はplt.savefig("image.png")の行で終わっていたのですが、その後にplt.show()が合った方が挙動が安定するという話を聞きましたので、エラーを吐くようになってから文を追加しました。

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

matplotlib 3.3.4
numpy 1.19.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下の様なエラーメッセージが表示されています。

python

1AttributeError: 'NoneType' object has no attribute 'ndim'

これは、

python

1ax.plot_surface(Y, X, data, rstride=1, cstride=1, color='white', edgecolor='black', linewidth=.25)

dataNone である事を意味しています。そして、

python

1plot_e_field(ax, plotting_point[ 'data_to_plot'], plotting_point[ 'num_steps'], plotting_point['label'])

plotting_point['data_to_plot']None であるという事になります。

以降、処理を遡ってみると最終的に、

python

1plotting_points = [{'label': 'a','num_steps':4700, 'data_to_plot':None}, {'label':'b', 'num_steps':4800, 'data_to_plot':None}, { 'label':'c' ,'num_steps':4900, 'data_to_plot':None}, {'label':'d', 'num_steps':5000, 'data_to_plot':None}, ]

data_to_plot キーの値が初期値(None)のままである、という結論になります。

投稿2022/01/07 15:51

melian

総合スコア19703

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

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

ShibaSamo

2022/01/07 17:34

盲点でした... ご指摘の部分を修正した結果、無事動作しました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問