首页 > 解决方案 > 在R中使用ggplot的意大利面条图?

问题描述

我想制作一个 speghatii plot,我需要在其中查看一年中的几天以及每个的x-axis数据。然后,我想要一个单独的年份,只有 3 个月的数据处于相同但不同的线上。这是我生成的图表(附加),其中每个特定的数据是- 我不想要图表。我想要一个图表。谢谢y-axisYear(PCPNewData)plottedfigurecolorboldsample codeYearDaystackedbarline

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我用手 画出我想要的(见附件)。我想把所有days of the Years关于x-axis它的数据放在y-axis 在此处输入图像描述

标签: rggplot2plottidyversetimeserieschart

解决方案


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

首先,你的日子是有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)

在此处输入图像描述


编辑:基于更新的新图表

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

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))

在此处输入图像描述

它回答了你的问题吗?


推荐阅读