ggplot2绘图网格单元面积查询及自定义设置求助
问题解答:ggplot2绘制树冠图的网格单元面积设置
一、当前网格单元的面积确认
你图中的网格是sf数据自带坐标系的默认网格,并非ggplot2生成,要确定面积需先查看数据的坐标系(CRS):
- 运行
st_crs(crowns4_crop)查看信息:如果是UTM这类投影坐标系(单位为米),可通过网格边长计算面积,比如100m×100m的网格对应1公顷;如果是WGS84这类地理坐标系(单位为度),网格面积随纬度变化,需先转换为投影坐标系再计算。
二、设置特定面积的网格单元(1公顷/0.5公顷/0.1公顷)
需要手动生成对应面积的网格后叠加到图中,步骤如下:
1. 计算目标网格的边长(基于投影坐标系,单位米)
- 1公顷=10000㎡ → 正方形边长100m
- 0.5公顷=5000㎡ → 正方形边长≈70.71m
- 0.1公顷=1000㎡ → 正方形边长≈31.62m
2. 生成对应网格的代码示例
假设数据已为UTM投影(单位米),用sf包的st_make_grid生成网格:
# 获取数据边界范围 bbox <- st_bbox(crowns4_crop) # 生成1公顷网格(100m边长) grid_1ha <- st_make_grid(bbox, cellsize = 100, square = TRUE) %>% st_sf() # 生成0.5公顷网格(约70.71m边长) grid_0.5ha <- st_make_grid(bbox, cellsize = sqrt(5000), square = TRUE) %>% st_sf() # 生成0.1公顷网格(约31.62m边长) grid_0.1ha <- st_make_grid(bbox, cellsize = sqrt(1000), square = TRUE) %>% st_sf()
3. 将网格叠加到ggplot图中
以叠加1公顷网格为例,修改原代码:
ggplot() + geom_sf(data = crowns4_crop, aes(fill = convhull_area)) + scale_fill_viridis_c(name = "Crown area (m²)") + # 添加1公顷网格,设置线条样式 geom_sf(data = grid_1ha, color = "gray", linetype = "dashed", fill = NA) + geom_sf(data = ttops4_crop, color = "red", pch = 3, size = 2, show.legend = FALSE) + theme(axis.text = element_blank(), axis.title = element_blank(), axis.ticks = element_blank(), plot.title = element_text(hjust = 0.5)) + labs(title = "Crown & Tree (1公顷网格)")
注意事项
- 若数据为地理坐标系(单位度),需先转换为投影坐标系,比如加拿大北方林区可选用对应UTM分带(如UTM Zone 10N,CRS代码32610):
crowns4_crop_proj <- st_transform(crowns4_crop, crs = 32610) ttops4_crop_proj <- st_transform(ttops4_crop, crs = 32610)
- 若需矩形网格,可给
cellsize传入长度为2的向量,比如cellsize = c(100, 50)即生成100m×50m的矩形网格。
内容的提问来源于stack exchange,提问作者Léa HELLEGOUARCH
相关产品推荐
相关产品推荐

