如何用ggplot创建6幅图并保存至PDF?NDVI分类子集绘图求助
搞定模糊C均值聚类后NDVI时间序列的可视化与PDF保存
嘿,我来帮你把这个需求落地!你已经完成了模糊C均值聚类,现在要可视化每个类别的随机NDVI时间序列,还要用ggplot生成6幅图并存成PDF,咱们一步步来:
第一步:把随机子集数据整理成ggplot喜欢的格式
你的临时代码已经选了10000个随机像素,接下来要把聚类标签、NDVI值和对应日期绑定在一起,并且转成长格式(ggplot对长数据更友好)。假设你有一个dates向量存着250个Landsat影像的日期,先把这部分补全:
# 先准备日期向量(这里模拟250个间隔16天的日期,你替换成自己的真实日期就行) dates <- seq.Date(as.Date("2013-01-01"), by = "16 days", length.out = 250) # 把随机子集的矩阵转成数据框,给列命名为日期 random_pred_df <- as.data.frame(random_pred_matrix) colnames(random_pred_df) <- dates # 转成长格式:每一行对应一个像素的一个时间点的NDVI值 library(tidyr) random_pred_long <- random_pred_df %>% mutate(pixel_id = row_number(), # 给每个随机像素加个ID cluster = random_cluster) %>% # 绑定聚类标签 pivot_longer(cols = all_of(dates), names_to = "date", values_to = "ndvi") %>% mutate(date = as.Date(date)) # 确保日期是正确的格式
第二步:用ggplot绘制6个类别的时间序列图
这里有两种方式,你可以根据需求选:
方式1:用分面一次性生成6幅图(简洁高效)
用facet_wrap自动把6个簇的图排成网格,非常省心:
library(ggplot2) cluster_facet_plot <- ggplot(random_pred_long, aes(x = date, y = ndvi, group = pixel_id)) + geom_line(alpha = 0.1) + # 设置透明度,避免太多线条重叠看不清 facet_wrap(~cluster, ncol = 2) + # 排成2列,6个图刚好3行 labs(title = "NDVI Time Series by Fuzzy C-Means Cluster", x = "Date", y = "NDVI Value") + theme_bw() + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转日期标签,防止挤在一起
方式2:单独绘制每个簇的图(方便个性化调整)
如果想给每个图单独设置样式,比如不同的颜色、标题,可以用循环生成每个图,再用gridExtra组合:
library(gridExtra) # 创建空列表存每个簇的图 plot_list <- list() for (cluster_num in 1:6) { # 筛选当前簇的随机数据 cluster_data <- dplyr::filter(random_pred_long, cluster == cluster_num) # 绘制单簇的时间序列图 p <- ggplot(cluster_data, aes(x = date, y = ndvi, group = pixel_id)) + geom_line(alpha = 0.1, color = "#2E8B57") + # 自定义线条颜色 labs(title = paste("Cluster", cluster_num), x = "Date", y = "NDVI Value") + theme_bw() + theme(axis.text.x = element_text(angle = 45, hjust = 1), plot.title = element_text(hjust = 0.5)) # 标题居中 plot_list[[cluster_num]] <- p } # 把6幅图组合成3行2列的布局 combined_plot <- grid.arrange(grobs = plot_list, nrow = 3, ncol = 2)
第三步:把图表保存成PDF文件
不管用哪种方式生成的图,都可以用ggsave轻松保存成PDF:
# 保存分面图到PDF ggsave("cluster_ndvi_facet.pdf", plot = cluster_facet_plot, width = 12, height = 10, dpi = 300) # 如果是组合的单独图,保存这个 ggsave("individual_cluster_ndvi.pdf", plot = combined_plot, width = 12, height = 15, dpi = 300)
几个小提示
- 模糊聚类的隶属度:如果你想利用模糊C均值的隶属度信息(不是硬聚类标签),可以用
results[[6]]$membership来做加权可视化,但对于时间序列的簇特征展示,硬标签已经足够清晰了。 - 随机子集大小:10000个像素可能会让绘图变慢,你可以把
runif(10000, ...)改成runif(2000, ...),既快又能体现簇的规律。 - 日期格式:一定要确保你的
dates是Date或POSIXct类型,不然ggplot会把日期当成字符串,x轴刻度会乱。
内容的提问来源于stack exchange,提问作者m4D_guY
相关产品推荐
相关产品推荐

