代码之家  ›  专栏  ›  技术社区  ›  Rancho

ggplot中的分面包裹/分面网格图:多日期问题[重复]

  •  0
  • Rancho  · 技术社区  · 7 月前

    我有CSV格式的包含十个站的时间序列数据。每个站由三个参数(SPEI3、SPEI6和SPEI12)组成。每个SPEI类别都有自己的开始日期。两个站点的样本数据如下:;

    date,SPEI,Bulongwa,Igembe
    3/1/1990,SPEI3,-0.633666276,-1.091342548
    4/1/1990,SPEI3,-1.154270937,-1.260999014
    5/1/1990,SPEI3,-1.730380247,-1.918347545
    6/1/1990,SPEI3,-1.554194439,-1.669196002
    7/1/1990,SPEI3,-0.585667705,-0.530214816
    8/1/1990,SPEI3,-0.174442879,0.058721878
    9/1/1990,SPEI3,1.177516783,0.488334655
    10/1/1990,SPEI3,0.337872023,0.321737439
    11/1/1990,SPEI3,-0.862164636,-0.237407495
    12/1/1990,SPEI3,-1.022895024,-0.928489143
    6/1/1990,SPEI6,-1.397632538,-0.722279406
    7/1/1990,SPEI6,-1.338037747,-0.663393368
    8/1/1990,SPEI6,-1.773644884,-0.835592437
    9/1/1990,SPEI6,-1.469993994,-0.731273761
    10/1/1990,SPEI6,-0.640571906,-0.237666955
    11/1/1990,SPEI6,-0.963494314,-0.222447386
    12/1/1990,SPEI6,-0.963266132,-0.50631387
    12/1/1990,SPEI12,-1.743275704,-0.704998147
    1/1/1991,SPEI12,-1.398853355,-0.668119127
    2/1/1991,SPEI12,-1.630408685,-0.781252647
    3/1/1991,SPEI12,-1.451362535,-0.716740124
    4/1/1991,SPEI12,-1.162635355,-0.554554904
    5/1/1991,SPEI12,-0.723093595,-0.513940083
    6/1/1991,SPEI12,-0.710841553,-0.511117277
    7/1/1991,SPEI12,-0.682616494,-0.517770976
    8/1/1991,SPEI12,-0.70090681,-0.5207414
    9/1/1991,SPEI12,-0.748674903,-0.532204739
    10/1/1991,SPEI12,-0.595583026,-0.502605309
    11/1/1991,SPEI12,-0.383636489,-0.429787626
    12/1/1991,SPEI12,0.146175789,-0.197058223
    

    完整的数据集可以在以下链接中找到。 SPEI Data

    使用以下代码,使用单个站绘图效果很好。

    Code:
    
    # Libraries
    library(ggplot2)
    library(ggpubr)
    #Loading Data
    df <- read.csv("SPEI.csv")
    
    #Create Rdate format
    dates <- as.Date(df$date, format = '%m/%d/%Y')
    df$date <- dates
    
    
    # Plot
    ggplot(df, aes(x = date, y = Bulongwa, fill=SPEI))+
      geom_area(position = 'identity')+
      theme_pubclean()+
      scale_fill_manual(values = c("#003333","#00CCFF", "#996600"), name = NULL)+
      scale_x_date(date_breaks = "2 years",date_labels = "%Y", expand = c(0,0)) +
      theme(axis.text.x = element_text(angle=90, vjust=.5))+
      labs(x = "Date: [Years]", y = 'SPEI-Drought / Wetness Index')+
      theme(plot.title = element_text(hjust = 0.5, size=14, face= "bold", colour= "black"))+
      theme(plot.title = element_text(hjust = 0.5), legend.position = 'bottom')+
      theme(strip.text = element_text(size =11.5, face="bold"),
            legend.title = element_text(colour = "black", size =12, face="bold"),
            legend.text = element_text(colour = "black", size =12,  face="bold"),
            axis.title.y = element_text(colour = "black", size =14, face="bold"),
            axis.text.y = element_text(colour = "black", size =14),
            axis.title.x = element_text(colour = "black", size =12, face="bold"),
            axis.text.x = element_text(colour = "black", size =15))+
      theme(panel.spacing.x = unit(1, "lines"),
            panel.border = element_rect(fill = 'transparent',  colour = "#BFD5E3"))
    

    结果: enter image description here

    但是,如果我重塑数据并使用 facet_wrap(~variable) 产出一团糟。修改后的代码和结果如下。

    Code: 
    # Libraries
    library(ggplot2)
    library(reshape)
    library(ggpubr)
    
    #Loading Data
    df <- read.csv("SPEI.csv")
    
    #Create Rdate format
    dates <- as.Date(df$date, format = '%m/%d/%Y')
    dt = melt(df, id.vars = c("SPEI","date"))
    dt$date <- dates
    head(dt)
    
    # Plot
    ggplot(dt, aes(x = date, y = value, fill=SPEI))+  
      geom_area(position = 'identity')+
      theme_pubclean()+
      scale_fill_manual(values = c("#003333","#00CCFF", "#996600"), name = NULL)+
      scale_x_date(date_breaks = "2 years",date_labels = "%Y", expand = c(0,0)) +
      theme(axis.text.x = element_text(angle=90, vjust=.5))+
      facet_wrap(~variable)+
      labs(x = "Date: [Years]", y = 'SPEI-Drought / Wetness Index')+
      theme(plot.title = element_text(hjust = 0.5, size=14, face= "bold", colour= "black"))+
      theme(plot.title = element_text(hjust = 0.5), legend.position = 'bottom')+
      theme(strip.text = element_text(size =11.5, face="bold"),
            legend.title = element_text(colour = "black", size =12, face="bold"),
            legend.text = element_text(colour = "black", size =12,  face="bold"),
            axis.title.y = element_text(colour = "black", size =14, face="bold"),
            axis.text.y = element_text(colour = "black", size =14),
            axis.title.x = element_text(colour = "black", size =12, face="bold"),
            axis.text.x = element_text(colour = "black", size =15))+
      theme(panel.spacing.x = unit(1, "lines"),
            panel.border = element_rect(fill = 'transparent',  colour = "#BFD5E3"))
    

    结果: enter image description here

    我想要的输出如下: enter image description here

    对此有解决方法吗?

    1 回复  |  直到 7 月前
        1
  •  2
  •   Eliot Dixon tmfmnk    7 月前

    有5个NA(我假设)写为“#NAME?” Igembe 列。这导致 伊根贝 列作为类阅读 Character .打电话后 melt() ,结果 value 列是类 性格 同样,这就是为什么你的情节看起来有点奇怪。如果你对这些观察结果被视为NA而不包括在你的图中没有意见,你可以投 伊根贝 列转换为数字 as.numeric() 打电话之前 熔化() “#NAME?”观察结果将被编码为NA。

    代码:

    library(ggplot2)
    library(reshape)
    library(ggpubr)
    
    #Loading Data
    df <- read.csv("SPEI.csv")
    
    # Cast column to numeric
    df$Igembe <- as.numeric(df$Igembe)
    
    #Create Rdate format
    dates <- as.Date(df$date, format = '%m/%d/%Y')
    dt = melt(df, id.vars = c("SPEI","date"))
    dt$date <- dates
    head(dt)
    
    # Plot
    ggplot(dt, aes(x = date, y = value, fill=SPEI))+  
      geom_area(position = 'identity')+
      theme_pubclean()+
      scale_fill_manual(values = c("#003333","#00CCFF", "#996600"), name = NULL)+
      scale_x_date(date_breaks = "2 years",date_labels = "%Y", expand = c(0,0)) +
      theme(axis.text.x = element_text(angle=90, vjust=.5))+
      facet_wrap(~variable)+
      labs(x = "Date: [Years]", y = 'SPEI-Drought / Wetness Index')+
      theme(plot.title = element_text(hjust = 0.5, size=14, face= "bold", colour= "black"))+
      theme(plot.title = element_text(hjust = 0.5), legend.position = 'bottom')+
      theme(strip.text = element_text(size =11.5, face="bold"),
            legend.title = element_text(colour = "black", size =12, face="bold"),
            legend.text = element_text(colour = "black", size =12,  face="bold"),
            axis.title.y = element_text(colour = "black", size =14, face="bold"),
            axis.text.y = element_text(colour = "black", size =14),
            axis.title.x = element_text(colour = "black", size =12, face="bold"),
            axis.text.x = element_text(colour = "black", size =15))+
      theme(panel.spacing.x = unit(1, "lines"),
            panel.border = element_rect(fill = 'transparent',  colour = "#BFD5E3"))
    
    

    输出: enter image description here

    推荐文章