You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

交互式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

火山引擎 最新活动