如何在Python中为海底地形散点图添加指定值的多条等高线
问题:给海底地形散点图添加指定等高线
我有一个包含latitude(纬度)、longitude(经度)、elevation(海拔)三列的DataFrame,想要绘制海底地形图。目前已经用以下代码生成了散点图:
Df2D = pd.read_csv(r'C:\Users\Thomas\Desktop\Df.csv', header = 0, delimiter=';') Y = Df2D['lat'].values X = Df2D['lon'].values Z = Df2D['elevation'].values plt.scatter(X,Y, c=Z) plt.colorbar() plt.show()
现在我想给图添加0m、-10m、-50m等指定值的多条等高线,但使用plt.tricontour只得到单一等高线,效果不好:
plt.tricontour(X, Y, Z, 0, linewidths=0.5, colors='k') plt.tricontourf(X, Y, Z, 0)
请问怎么优化结果?
解决方案
1. 核心修改:传入等高线值列表
你当前代码只生成单一条等高线,是因为plt.tricontour的第四个参数传入了单个数值0,要生成多条指定等高线,只需将目标值做成列表传入:
import pandas as pd import matplotlib.pyplot as plt # 读取数据 Df2D = pd.read_csv(r'C:\Users\Thomas\Desktop\Df.csv', header=0, delimiter=';') X = Df2D['lon'].values Y = Df2D['lat'].values Z = Df2D['elevation'].values # 绘制散点底图,可选海底友好配色 plt.scatter(X, Y, c=Z, cmap='Blues_r') plt.colorbar(label='海拔(m)') # 指定需要的等高线值 target_levels = [0, -10, -50] # 绘制等高线线条,用对比色增强辨识度 plt.tricontour(X, Y, Z, levels=target_levels, linewidths=1, colors='white', linestyles='--') # 添加等高线标签,提升可读性 plt.clabel(plt.tricontour(X, Y, Z, levels=target_levels), inline=True, fontsize=8) plt.xlabel('经度') plt.ylabel('纬度') plt.title('海底地形图(含指定等高线)') plt.show()
2. 进阶优化:插值到规则网格(解决数据分布不均问题)
如果原始数据点分布稀疏或不均匀,tricontour生成的等高线可能出现断裂。可以用scipy的插值方法将数据转换为规则网格,再用plt.contour绘制更平滑的等高线:
import pandas as pd import matplotlib.pyplot as plt from scipy.interpolate import griddata import numpy as np # 读取数据 Df2D = pd.read_csv(r'C:\Users\Thomas\Desktop\Df.csv', header=0, delimiter=';') X = Df2D['lon'].values Y = Df2D['lat'].values Z = Df2D['elevation'].values # 创建规则网格 xi = np.linspace(X.min(), X.max(), 1000) yi = np.linspace(Y.min(), Y.max(), 1000) xi, yi = np.meshgrid(xi, yi) # 用三次插值将Z值映射到网格 zi = griddata((X, Y), Z, (xi, yi), method='cubic') # 绘制散点底图+平滑等高线 plt.scatter(X, Y, c=Z, cmap='Blues_r', s=8) plt.contour(xi, yi, zi, levels=[0, -10, -50], linewidths=1, colors='white', linestyles='--') plt.clabel(plt.contour(xi, yi, zi, levels=[0, -10, -50]), inline=True, fontsize=8) plt.colorbar(label='海拔(m)') plt.xlabel('经度') plt.ylabel('纬度') plt.show()
3. 细节调整建议
- 配色:
Blues_r是反转蓝色系,深色调对应低海拔(深海),比默认配色更贴合海底地形展示; - 等高线样式:用白色虚线在深色底图上更醒目,可根据需求调整
linewidths和linestyles; - 标签:
clabel函数可以给等高线添加数值标签,让图的信息更直观。
内容的提问来源于stack exchange,提问作者toms
相关产品推荐
相关产品推荐

