在 R 中使用 ggplot 绘制意大利面条图?
Spaghetti plot using ggplot in R?
我想制作一个 speghatii plot
,我需要在 x-axis
上查看一年中的几天,并在 y-axis
上查看每个 Year
的数据。然后我希望单独的一年只有 3 个月的数据 (PCPNewData)
是 plotted
在相同的 figure
但不同的 color
和 bold
行。这是我的 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))
它能回答您的问题吗?
我想制作一个 speghatii plot
,我需要在 x-axis
上查看一年中的几天,并在 y-axis
上查看每个 Year
的数据。然后我希望单独的一年只有 3 个月的数据 (PCPNewData)
是 plotted
在相同的 figure
但不同的 color
和 bold
行。这是我的 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))
它能回答您的问题吗?