使用matplotlib绘制EC气压层面的等高线图及3D图像,首先安装matplotlib库和numpy库,这里略去安装步骤。
等高线图制作:
import matplotlib.pyplot as plt
import numpy as np
def height():
f = open('ecpl_2018021500000_H_0200.txt', 'r')
xfile = f.readlines()
z = []
for line in xfile:
z.append(line)
xsplit = []
for item in z:
xsplit.append(item.split())
ndz = np.array(xsplit[::-1])
return ndz
导入必需的库,读取气压等高度文件,这里的气压层数据文件为一个包含281*361个高度数据的文本文件,其包含10°S到60°N,60°E到150°E 200hP气压层的高度数据。
首先读取文件,并将数据整理成一个281*361的二维数组,由于matpoltlib的等高层图绘制只接受numpy.ndarray格式的数据,再将二维数组转换成后者的格式。
def contour():
plt.figure()
plt.title('ecpl 201802150000 200hpheight')
plt.xlabel('longtitude(degree)')
plt.ylabel('latitude(degree)')
#nlon, nlat = coordinate()
x = np.linspace(60, 150, 361)
y = np.linspace(-10, 60, 281)
X, Y = np.meshgrid(x, y)
plt.contourf(X, Y, height(), 10, alpha=0.9, cmap=plt.get_cmap('winter'))
Con = plt.contour(X, Y, height(), 10, colors='black')
plt.clabel(Con, inline=True, fontsize=7)
plt.show()
if __name__ == '__main__':
contour()
plt.contourf用于创建等高线图底图,'10'表示等高线层数,alpha表示图像透明度,cmap用于控制配色方案
#matpoltlib库自带配色方案见matpoltlib-colormap
plt.contour和plt.clabel用于创建等高线和标线字,color定义等高线颜色,inline表示数字位于等高线内,fontsize控制字体大小。
生成效果图:
3D图制作:
3D图制作需要Axes3D库,直接安装mpl_toolkits即可
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
def height():
f = open('ecpl_2018021500000_H_0200.txt', 'r')
xfile = f.readlines()
z = []
for line in xfile:
z.append(line)
xsplit = []
for item in z:
xsplit.append(item.split())
nxsplit = []
for lst in xsplit:
nlst = []
for item in lst:
nitem = float(item)
nlst.append(nitem)
nxsplit.append(nlst)
ndarray = np.array(nxsplit[::-1])
return ndarray
依然是先读取txt文件并将数据转化为numpy.ndarray格式,这里要注意3D图制作要保证所有数据格式都为numpy.float64,如等高线图制作是直接使用numpy.str格式的数据会报错,所以这里在读取完数据后首先将其改为了float格式,再将二维数组转化为numpy.ndarray格式。
def tdaxes():
fig = plt.figure()
ax = Axes3D(fig)
plt.title('ecpl 201802150000 200hpheight')
plt.xlabel('longtitude(degree)')
plt.ylabel('latitude(degree)')
lon = np.linspace(60, 150, 361)
lat = np.linspace(-10, 60, 281)
Lon, Lat = np.meshgrid(lon, lat)
H = height()
#Z = np.array((Lon + Lat) / 2)
#print(type(H), type(Z))
#print(type(Z[0][0]), type(Lon[0][0]))
ax.plot_surface(Lon, Lat, H, rstride=1, cstride=1, cmap=plt.cm.coolwarm)
plt.show()
if __name__ == '__main__':
tdaxes()
之后通过ax.plot_surface函数制作3D图,rstride和cstride表示在x、y轴方向的划分层数,cmap依然控制配色方案,最后画出的图如下: