python绘制等值线(等高线等水压线等等都可)
本人大三,做给排水管网系统课设时老师要求绘制等水压线图,通常是使用南方cass或者鸿业或天正的相关插件,不过还需要专门下载,网盘也没有会员来不及下载,网上的包也怕有病毒,还不如自己动水,丰衣足食,此时就要用到在数据处理方面堪称万能的python了。
已知二维横纵坐标以及相应坐标的高程数据(或自由水压数据或其他),通过以下代码可以得到等值线图。
点的横纵坐标通过老师给的cad图可以批量获取,高程数据不好批量导出,只能自己一个个从cad里对着打。
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom scipy.interpolate import griddata as gd
设置基本图片画板
如果有图且需要将等值线绘制在底图上,画板长宽比最好设置成与底图长宽比相同,这样才能在放大后和底图上的坐标一一对应
fig = plt.figure(figsize=(10, 10))ax = fig.add_subplot(111, facecolor='w', frame_on=False)
规定平面范围
这个就看坐标的跨度自行设置
numcols, numrows = 1000, 1000xi = np.linspace(0,3000, numcols)yi = np.linspace(0, 3000, numrows)xi, yi = np.meshgrid(xi, yi)
提取数据
data = pd.read_csv('马尾规划高程数据.txt', delim_whitespace=True)
节点坐标数据处理以及赋值
此处需要合理设置零点,也是根据横纵坐标的跨度来确定
x,y,z = data['x'].values-77448.1299, data['y'].values-956.306396, data['自由水压'].values#处理自由水压数据zi = gd((x,y),data['自由水压'].values,(xi, yi),method='cubic')
等值线绘制
这是出图的核心,看不懂的可以自己上网搜plt.contour()和plt.clabel()
con = plt.contour(xi, yi, zi, 20,linewidths=0.5)plt.clabel(con, inline=10, fontsize=6)
以x标示节点
plt.scatter(x,y,color='#555555',edgecolor='#555555',alpha=1,marker='x',norm=0,linewidths=10,s=50,cmap=None,vmin=zi.min(), vmax=zi.max(), zorder=4)
图名
plt.title("Isobaric chart")plt.savefig("马尾规划等水压.png", format="png", dpi=500, transparent=True)
效果图
叠合到cad中并裁剪后效果如下:
最后附上完整代码:
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom scipy.interpolate import griddata as gd# 设置基本图片画板fig = plt.figure(figsize=(10, 10))ax = fig.add_subplot(111, facecolor='w', frame_on=False)#规定平面范围numcols, numrows = 1000, 1000xi = np.linspace(0,3000, numcols)yi = np.linspace(0, 3000, numrows)xi, yi = np.meshgrid(xi, yi)# 提取数据data = pd.read_csv('马尾规划高程数据.txt', delim_whitespace=True)# 节点坐标数据处理以及赋值x,y,z = data['x'].values-77448.1299, data['y'].values-956.306396, data['自由水压'].values#处理自由水压数据zi = gd((x,y),data['自由水压'].values,(xi, yi),method='cubic')# 等值线绘制con = plt.contour(xi, yi, zi, 20,linewidths=0.5)plt.clabel(con, inline=10, fontsize=6)# 以x标示节点#plt.scatter(x,y,color='#555555',edgecolor='#555555',alpha=1,marker='x',norm=0,linewidths=10,s=50,cmap=None,vmin=zi.min(), vmax=zi.max(), zorder=4)#图名plt.title("Isobaric chart")#保存并输出为图片plt.savefig("马尾规划等水压.png", format="png", dpi=500, transparent=True)
如有纰漏和错误,敬请读者朋友们批评指正。