You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:49:02