前提・実現したいこと
numpy及びmatplotlibの仕様を理解するため、
X,Y2次元空間における速度ベクトル場(U(X,Y),V(X,Y))の渦度Curl(X,Y)を算出しようとしています。
発生している問題
2次元配列をflatten()により1次元配列化した3つの1次元配列var1, var2, var3を引数として、matplotlib.pyplot.plot.scatterにより散布図を作成しました。
var3をprintすると意図どおり(すべて値が2の配列)になっているにも関わらず、scatterでカラー表示をすると明らかに2ではない値で色付けされてしまっています。
Python
1 #2次元配列を1次元化 2 var1=X.flatten() 3 var2=Y.flatten() 4 var3=Curl.flatten() 5 print(var1, type(var1)) 6 print(var2, type(var2)) 7 print(var3, type(var3)) 8 9 >[-1. 0. 1. -1. 0. 1. -1. 0. 1.] <class 'numpy.ndarray'> 10 >[-1. -1. -1. 0. 0. 0. 1. 1. 1.] <class 'numpy.ndarray'> 11 >[ 2. 2. 2. 2. 2. 2. 2. 2. 2.] <class 'numpy.ndarray'> 12 13 14 15 #散布図表示 16 plt.scatter(var1, var2, c=var3, s=200, cmap='rainbow') 17 plt.colorbar() 18 19![散布図表示結果](262f3a21872b2766a2e03a67b3989b72.png)
該当のソースコード
Python
1import numpy as np 2import matplotlib.pyplot as plt 3import math 4 5class var1d: 6 def __init__(self, var_min, var_max, var_N): 7 self.min = var_min 8 self.max = var_max 9 if isinstance(var_N, int) and var_N > 1: 10 self.N = var_N 11 else: 12 print ('格子点数var_Nが1より大きくないか整数ではないため終了: var_N='+str(var_N)) 13 exit() 14 def array1d(self): 15 return np.linspace(self.min, self.max, self.N) 16 def diff(self): 17 return (self.max - self.min)/(self.N - 1) 18 19def main(): 20 #x、y方向の定義域と格子点数を指定して1次元配列を作成 21 x = var1d(-1, 1, 3) 22 y = var1d(-1, 1, 3) 23 24 #x,yの1次元配列(サイズm, n)をm x nの2次元配列に拡張 25 (X, Y)= np.meshgrid(x.array1d(), y.array1d()) 26 27 #2変数関数R(X,Y), U(X,Y), V(X,Y)の2次元配列を作成 28 R = np.sqrt( X ** 2 + Y ** 2 ) 29 30 Vel_theta = R * R / (R + 1e-10) 31 U = -Vel_theta * Y / (R + 1e-10) 32 V = Vel_theta * X / (R + 1e-10) 33 34 #Uの偏微分dU/dX(X,Y), dU/dX() 35 (dUdY, dUdX) = np.gradient(U, y.diff(), x.diff()) 36 #Vの偏微分dV/dX(X,Y), dV/dX() 37 (dVdY, dVdX) = np.gradient(V, y.diff(), x.diff()) 38 39 #渦度のZ方向成分 40 Curl = dVdX -dUdY 41 42 #2次元配列を1次元化 43 var1=X.flatten() 44 var2=Y.flatten() 45 var3=Curl.flatten() 46 print(var1, type(var1)) 47 print(var2, type(var2)) 48 print(var3, type(var3)) 49 50 #散布図表示 51 plt.scatter(var1, var2, c=var3, s=200, cmap='rainbow') 52 plt.colorbar() 53 54 #描画 55 plt.grid() 56 plt.show() 57 58 59if __name__ == '__main__': 60 main()
試したこと
scatter()ではなく,plot()等で確認しても同様に意図通りの分布とはなりませんでした。
補足情報(FW/ツールのバージョンなど)
Python3.6 @ iOS Pythonista
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。