在 R 中使用 ggplot 绘制意大利面条图?

Spaghetti plot using ggplot in R?

我想制作一个 speghatii plot,我需要在 x-axis 上查看一年中的几天,并在 y-axis 上查看每个 Year 的数据。然后我希望单独的一年只有 3 个月的数据 (PCPNewData)plotted 在相同的 figure 但不同的 colorbold 行。这是我的 sample code 生成的图表(已附),其中每个 Day 的每个 Year 的数据是 stacked- 我不想要 bar图形。我想要一个 line 图表。谢谢

library(tidyverse)
library(tidyr)

myDates=as.data.frame(seq(as.Date("2000-01-01"), to=as.Date("2010-12-31"),by="days"))
colnames(myDates) = "Date"
Dates = myDates %>% separate(Date, sep = "-", into = c("Year", "Month", "Day"))

LatestDate=as.data.frame(seq(as.Date("2011-01-01"), to=as.Date("2011-03-31"),by="days"))
colnames(LatestDate) = "Date"
NewDate = LatestDate %>% separate(Date, sep = "-", into = c("Year", "Month", "Day"))

PCPDataHis = data.frame(total_precip = runif(4018, 0,70), Dates)
PCPNewData = data.frame(total_precip = runif(90, 0,70), NewDate)

PCPDataHisPlot =PCPDataHis %>% group_by(Year) %>% gather(key = "Variable", value = "Value", -Year, -Day,-Month)

ggplot(PCPDataHisPlot, aes(Day, Value, colour = Year))+
  geom_line()+
  geom_line(data = PCPNewData, aes(Day, total_precip))

我想要一个如下图,其中每一行代表特定年份的数据

更新: 我用手画了我想要的figure(见附件)。我想要 x-axis 上的所有 days of the Years 及其在 y-axis 上的数据

您的代码中几乎没有错误。

首先,您的日期采用 character 格式。您需要以数字格式传递它们以使线条连续。

然后,你每天有多个数据(因为你每年有12个月),所以你需要总结一下这些数据:

Pel2 <- Pelly2Data %>% group_by(year,day) %>% summarise(Value = mean(Value, na.rm = TRUE))
  Pel3 <- Pelly2_2011_3months %>% group_by(year, day) %>% summarise(total_precip = mean(total_precip, na.rm = TRUE))


ggplot(Pel2, aes(as.numeric(day), Value, color = year))+
  geom_line()+
  geom_line(data = Pelly2_2011_3months, aes(as.numeric(day), y= total_precip),size = 2)

看起来更好,但很难应用特定的颜色模式

在我看来,如果你能比较每个数据集的均值,就会减少混淆,例如:

library(tidyverse)
Pel2 <- Pelly2Data %>% group_by(day) %>% 
    summarise(Mean = mean(Value, na.rm = TRUE),
                           SEM = sd(Value,na.rm = TRUE)/sqrt(n())) %>%
    mutate(Name = "Pel_ALL")
Pel3 <- Pelly2_2011_3months %>% group_by(day) %>% 
    summarise(Mean = mean(total_precip, na.rm = TRUE),
                           SEM = sd(total_precip, na.rm = TRUE)/sqrt(n())) %>%
    mutate(Name = "Pel3")

Pel <- bind_rows(Pel2,Pel3)

ggplot(Pel, aes(x = as.numeric(day), y = Mean, color = Name))+
    geom_ribbon(aes(ymin = Mean-SEM, ymax = Mean+SEM), alpha = 0.2)+
    geom_line(size = 2)


编辑:基于更新的新图表

要将您 post 的图表作为绘图,您需要有年中的某一天而不是月份中的某一天。我们可以通过设置日期序列来获取此信息,并使用 `lubridate 包中的 yday 函数提取一年中的第几天。

library(tidyverse)
library(lubridate)
Pelly2$Date = seq(ymd("1990-01-01"),ymd("2010-12-31"), by = "day")
Pelly2$Year_day <- yday(Pelly2$Date)

Pelly2_2011_3months$Date <- seq(ymd("2011-01-01"), ymd("2011-03-31"), by = "day")
Pelly2_2011_3months$Year_day <- yday(Pelly2_2011_3months$Date)

Pelly2$Dataset = "ALL"
Pelly2_2011_3months$Dataset = "2011_Dataset"

Pel <- bind_rows(Pelly2, Pelly2_2011_3months)

然后,您可以合并两个数据集并用不同的颜色、大小、透明度 (alpha) 表示它们,如下所示:

ggplot(Pel, aes(x = Year_day, y = total_precip, color = year, size = Dataset, alpha = Dataset))+
  geom_line()+
  scale_size_manual(values = c(2,0.5))+
  scale_alpha_manual(values = c(1,0.5))

它能回答您的问题吗?