需求如下:通过.txt格式的DEM文件(即 数字高程模型(Digital Elevation Model))绘制等高线云图。
通过python数据科学处理库numpy、pandas以及matplotlib三个库实现绘制等高线云图。
等高线云图如下图所示。
绘图所需的输入内容,即.txt格式的DEM文件如下图所示。文本格式文件,每两个数据之间通过“一个tab键”间隔,每3600个(我的文件中是3600个)数据之间有一个“回车键”进行分隔。每个数据均通过科学计数法计数。
通过pandas库直接读取文本文件中的数据到一个二维数组中去,再通过matplotlib绘图的contour函数一步绘制。
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
n = 3600
x = np.linspace(1, 3600, n)
y = np.linspace(1, 3600, n)
X, Y = np.meshgrid(x, y) # 每个点的横坐标、纵坐标分别形成的2维矩阵, X与Y是两个形状相同的2维矩阵
Z = pd.read_csv("DEM-whgt.txt", sep=' ', header=None, dtype='float')
plt.figure(figsize=(16, 16), dpi=10) # dpi分辨率
# C = plt.contourf(X, Y, Z, line_mum, colors='black', linewidths=.5)
C = plt.contourf(X, Y, Z)
# plt.clabel(C, inline=True, fontsize=12) # 图中画出等高线的数值
line_mum = 50
plt.contourf(X, Y, Z, line_mum, alpha=0.75, cmap='jet')
# plt.colorbar() # 绘制色棒
plt.axis('off') # 去坐标轴
plt.xticks([]) # 去 x 轴刻度
plt.yticks([]) # 去 y 轴刻度
plt.savefig("./333.png", bbox_inches='tight', pad_inches=0)
# bbox_inches='tight', pad_inches=0 去白边
# "./{}_resized.jpg".format(image_name.split(".jpg")[0]) 保留原始图像的名字并在后面加上_resized
plt.show()
n = 3600
x = np.linspace(1, 3600, n) # 在[1,3600]区间内等距生成n个数字,形成数组x
y = np.linspace(1, 3600, n)
X, Y = np.meshgrid(x, y) # 这里的X,Y均为2维数组
每个点的横坐标、纵坐标分别形成的2维矩阵, X与Y是两个形状相同的2维矩阵
np.meshgrid(x,y)
这句话通过数组x,y生成一一对应的网格化数据,X,Y形状大小均为3600×3600,X为对应位置坐标点的横坐标,Y为对应位置坐标点的纵坐标
Z = pd.read_csv("DEM-whgt.txt", sep=' ', header=None, dtype='float')
通过pandas
读取txt文档内容
plt.contourf(X, Y, Z, line_mum, alpha=0.75, cmap='jet')
通过contourf函数绘制等高线图,line_num
为等高线的数量,cmap
为色棒的类型。