使用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依然控制配色方案,最后画出的图如下: