Сюжет спагетти с использованием ggplot в R? - PullRequest
1 голос
/ 27 февраля 2020

Я хотел бы создать speghatii plot, где мне нужно видеть дни года на x-axis и данные на y-axis для каждого Year. Я бы тогда хотел, чтобы отдельный год, в котором были данные только за 3 месяца (PCPNewData), был бы plotted на той же figure, но другой линии color и bold. Вот мой sample code, который производит график (прилагается), где данные для каждого Year для конкретного Day равны 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))

enter image description here

Мне бы хотелось иметь рисунок, подобный приведенному ниже, где каждая строка представляет данные за определенный год enter image description here

ОБНОВЛЕНИЕ: Я рисую желаемое figure рукой (см. В приложении). Я хотел бы, чтобы все days of the Years на x-axis с его данными на y-axis enter image description here

1 Ответ

2 голосов
/ 27 февраля 2020

В вашем коде есть несколько ошибок.

Сначала ваши дни представлены в формате 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)

enter image description here

Выглядит лучше, но трудно применить конкретный c рисунок цвета

На мой взгляд, будет меньше путаницы, если вы сравните среднее значение для каждого набора данных, например:

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)

enter image description here


РЕДАКТИРОВАТЬ: новый график на основе обновления

К чтобы получить график, который вы публикуете в виде рисунка, вам нужно указать день года, а не день месяца. Мы можем получить эту информацию, установив последовательность дат и извлечь день года с помощью функции 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)

Затем вы можете объединить оба набора данных и представить их с разными цветами, размером, прозрачностью (альфа), как показано здесь:

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

enter image description here

Это отвечает на ваш вопрос?

...