作者:王一哲
日期:2019/12/2
我為了寫〈均勻帶電圓環的電場〉找到了 matplotlib 官網上關於 streamplot 指令的範例,範例中利用 numpy 的指令直接產生繪圖資料,但是我需要從 csv 檔中讀取由 VPython 產生的資料,因此我需要改寫範例的程式碼。
import numpy as np
import matplotlib.pyplot as plt
Y, X = np.mgrid[-3:3:100j, -3:3:100j]
U = -1 - X**2 + Y
V = 1 + X - Y**2
speed = np.sqrt(U*U + V*V)
plt.streamplot(X, Y, U, V, color=U, linewidth=2, cmap=plt.cm.autumn)
plt.colorbar()
plt.savefig('streamplot.png')
plt.show()
原來的範例中底下還有另外兩張圖,但我只是要測試指令及存取資料的方法,因此只留下一張圖。範例程式的第4行使用了 numpy.mgrid 產生 X、Y 資料,其語法為
Y, X = np.mgrid[y軸最小值:y軸最大值:y軸點數+j, x軸最小值:x軸最大值:x軸點數+j]
Y, X = np.mgrid[y軸最小值:y軸最大值:y軸間隔, x軸最小值:x軸最大值:x軸間隔]
因此第4行的功能是將
[[-3. -2.93939394 -2.87878788 ... 2.87878788 2.93939394
3. ]
[-3. -2.93939394 -2.87878788 ... 2.87878788 2.93939394
3. ]
[-3. -2.93939394 -2.87878788 ... 2.87878788 2.93939394
3. ]
...
[-3. -2.93939394 -2.87878788 ... 2.87878788 2.93939394
3. ]
[-3. -2.93939394 -2.87878788 ... 2.87878788 2.93939394
3. ]
[-3. -2.93939394 -2.87878788 ... 2.87878788 2.93939394
3. ]]
Y為
[[-3. -3. -3. ... -3. -3.
-3. ]
[-2.93939394 -2.93939394 -2.93939394 ... -2.93939394 -2.93939394
-2.93939394]
[-2.87878788 -2.87878788 -2.87878788 ... -2.87878788 -2.87878788
-2.87878788]
...
[ 2.87878788 2.87878788 2.87878788 ... 2.87878788 2.87878788
2.87878788]
[ 2.93939394 2.93939394 2.93939394 ... 2.93939394 2.93939394
2.93939394]
[ 3. 3. 3. ... 3. 3.
3. ]]
也可以改用 numpy.meshgrid 達成同樣的效果,將第4行改為以下的程式碼效果相同。
x = np.linspace(-3, 3, 100)
y = np.linspace(-3, 3, 100)
X, Y = np.meshgrid(x, y)
import numpy as np
Y, X = np.mgrid[-3:3:100j, -3:3:100j]
U = -1 - X**2 + Y
V = 1 + X - Y**2
speed = np.sqrt(U*U + V*V)
rows = len(X)
cols = len(X[0])
X = X.reshape(1, rows*cols)
Y = X.reshape(1, rows*cols)
U = U.reshape(1, rows*cols)
V = V.reshape(1, rows*cols)
speed = speed.reshape(1, rows*cols)
data = np.concatenate((X, Y, U, V, speed), axis=0).transpose()
np.savetxt('data.csv', data, delimiter=',')
[[ -3. -3. -13. -11. 17.02938637]
[ -2.93939394 -2.93939394 -12.64003673 -10.93939394 16.71648493]
[ -2.87878788 -2.87878788 -12.28741965 -10.87878788 16.41123723]
[ -2.81818182 -2.81818182 -11.94214876 -10.81818182 16.11359596]
[ -2.75757576 -2.75757576 -11.60422406 -10.75757576 15.82350948]
[ -2.6969697 -2.6969697 -11.27364555 -10.6969697 15.54092161]
[ -2.63636364 -2.63636364 -10.95041322 -10.63636364 15.26577155]
[ -2.57575758 -2.57575758 -10.63452709 -10.57575758 14.99799369]
[ -2.51515152 -2.51515152 -10.32598714 -10.51515152 14.73751749]
[ -2.45454545 -2.45454545 -10.02479339 -10.45454545 14.48426744]]
import numpy as np
import matplotlib.pyplot as plt
X, Y, U, V, speed = np.loadtxt('data.csv', delimiter=',', unpack=True)
num = int(np.sqrt(len(X)))
X = X.reshape(num, num)[0, :]
Y = Y.reshape(num, num)[0, :]
U = U.reshape(num, num)
V = V.reshape(num, num)
speed = speed.reshape(num, num)
plt.streamplot(X, Y, U, V, color=U, linewidth=2, cmap=plt.cm.autumn)
plt.colorbar()
plt.savefig('streamplotTest.png')
plt.show()
Python