交互式Python绘图子图创建及LVIS激光雷达HDF5数据可视化问询
问题解答
1. 如何基于交互式Python绘图创建子图?
如果用Matplotlib(最常用的交互式绘图库之一)创建子图,有几种简单直观的方式:
使用
plt.subplots()快速生成子图网格
这是最推荐的方法,它会一次性创建画布和所有子图对象,方便后续单独控制每个子图:import matplotlib.pyplot as plt import numpy as np # 创建2行2列的子图网格,返回画布和子图数组 fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8)) # 给第一个子图绘图 x = np.linspace(0, 2*np.pi, 100) axes[0,0].plot(x, np.sin(x)) axes[0,0].set_title('正弦曲线') # 给第二个子图绘图 axes[0,1].scatter(np.random.rand(50), np.random.rand(50), color='red') axes[0,1].set_title('随机散点') # 调整子图间距,避免重叠 plt.tight_layout() plt.show()使用
plt.subplot()逐个添加子图
适合不需要规则网格的场景,通过指定行、列、位置编号来添加:plt.figure(figsize=(10, 6)) # 第一个子图:1行2列的第1个位置 plt.subplot(1,2,1) plt.plot(x, np.cos(x)) plt.title('余弦曲线') # 第二个子图:1行2列的第2个位置 plt.subplot(1,2,2) plt.hist(np.random.randn(1000), bins=30) plt.title('正态分布直方图') plt.tight_layout() plt.show()
如果用Plotly(交互式更强的库)创建子图,可以用plotly.subplots.make_subplots():
import plotly.graph_objects as go from plotly.subplots import make_subplots fig = make_subplots(rows=2, cols=1) fig.add_trace(go.Scatter(x=x, y=np.sin(x), name='正弦'), row=1, col=1) fig.add_trace(go.Bar(x=[1,2,3], y=[4,2,5], name='柱状图'), row=2, col=1) fig.update_layout(height=600, width=800, title_text="Plotly 子图示例") fig.show()
2. 完善LVIS激光雷达HDF5数据的Basemap可视化
从你给出的代码来看,已经完成了数据读取和Basemap地图初始化,剩下的步骤是将经纬度坐标转换为地图投影坐标,然后绘制数据点,同时补全标注的代码:
完整的代码示例如下:
import h5py import numpy as np from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt # 读取HDF5数据 f = h5py.File('ILVIS1B_GA2016_0304_R1701_043591.h5','r') LONG = f['/LON0/'] LAT = f['/LAT0/'] X = LONG[...] Y = LAT[...] # 初始化Basemap m = Basemap(projection='merc', llcrnrlat=-0.5, urcrnrlat=0.5, llcrnrlon=9, urcrnrlon=10, lat_ts=0.25, resolution='i') # 将经纬度转换为地图投影坐标 x_proj, y_proj = m(X, Y) # 绘制地图元素 m.drawcoastlines() m.drawcountries() # 绘制纬线,补全labels参数(你代码里的Tr...应该是True) parallels = np.arange(-9.,10.,0.5) m.drawparallels(parallels, labels=[False, True, True, False]) # 绘制经线 meridians = np.arange(8.,11.,0.5) m.drawmeridians(meridians, labels=[True, False, False, True]) # 绘制LVIS数据点(用散点图,可调整标记大小和颜色) m.scatter(x_proj, y_proj, s=1, color='darkred', alpha=0.5) # 添加标题 plt.title('LVIS激光雷达数据分布') # 显示图像 plt.show() # 关闭HDF5文件 f.close()
几个关键补充点:
- 必须调用
m(X, Y)将WGS84经纬度转换为Mercator投影的坐标,否则数据无法正确显示在地图上 - 补全了
drawparallels的labels参数,格式为[左, 右, 上, 下],控制哪些方向显示纬线标注 - 添加了经线绘制,让地图更清晰
- 用
scatter绘制数据点,通过s调整点大小,alpha调整透明度避免点重叠 - 最后记得关闭HDF5文件,释放资源
内容的提问来源于stack exchange,提问作者GeoMonkey




