Создать барплот для представления временных рядов в ggplot2 - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть базовый фрейм данных с 3 столбцами: (i) дата (когда была взята проба);(ii) местоположение участка и (iii) двоичная переменная, указывающая, каково было состояние при отборе проб (например, влажный или сухой).

Некоторые воспроизводимые данные:

df <- data.frame(Date = rep(seq(as.Date("2010-01-01"), as.Date("2010-12-01"), by="months"),times=2))
df$Site <- c(rep("Site.A",times = 12),rep("Site.B",times = 12))
df$Condition<- as.factor(c(0,0,0,0,1,1,1,1,0,0,0,0,
                     0,0,0,0,0,1,1,0,0,0,0,0))

Я хотел бы использовать ggplot для создания гистограммы, показывающей состояние каждого узла (ось y) во времени (ось x) -состояние указано другим цветом.Я предполагаю, что какой-то перевернутый барплот был бы способом сделать это, но я не могу понять, как сказать ggplot2 распознавать значения хронологически, а не суммировать для каждого условия.Пока это моя попытка, которая явно не делает то, что мне нужно.

ggplot(df) +
geom_bar(aes(x=Site,y=Date,fill=Condition),stat='identity')+coord_flip()

Итак, у меня есть 2 вопроса. Во-первых, как мне сказать ggplot распознавать изменения в состоянии с течением времени, а не просто группировать каждое условие в традиционной гистограмме с накоплением?

Во-вторых, кажется, что ggplot конвертирует датув числовое значение, как бы мне переформатировать ось х, чтобы показать период времени, например, в формате месяц-год? Я попытался сделать это с помощью функции scale_x_date, но получил сообщение об ошибке.

labDates <- seq(from = (head(df$Date, 1)), 
               to = (tail(df$Date, 1)),  by = "1 months")
Datelabels <-format(labDates,"%b %y")

ggplot(df) +
geom_bar(aes(x=Site,y=Date,fill=Condition),stat='identity')+coord_flip()+
scale_x_date(labels = Datelabels, breaks=labDates)

Я также пытался преобразовать времена выборки в коэффициенты и отображать их вместо этого.Ниже я сделал это, изменив каждый период выборки на букву (в моем собственном коде уровни факторов представлены в формате месяц-год - для простоты я поставил здесь буквы).Но я не могу отформатировать ось, чтобы разместить каждый уровень фактора в виде отметки.Либо дата или фактор решения для этого второго вопроса было бы здорово!

df$Factor <- as.factor(unique(df$Date))
levels(df$Factor) <- list(A = "2010-01-01", B = "2010-02-01", 
C = "2010-03-01", D = "2010-04-01", E = "2010-05-01", 
`F` = "2010-06-01", G = "2010-07-01", H = "2010-08-01", 
I = "2010-09-01", J = "2010-10-01", K= "2010-11-01", L = "2010-12-01")

ggplot(df) +
geom_bar(aes(x=Site,y=Date,fill=Condition),stat='identity')+coord_flip()+
scale_y_discrete(breaks=as.numeric(unique(df$Date)),
 labels=levels(df$Factor))

Заранее спасибо!

1 Ответ

0 голосов
/ 25 февраля 2019

На самом деле не имеет смысла использовать geom_bar(), учитывая, что вы не хотите суммировать данные и требует визуализации через «время»

Я бы предпочел использовать geom_line() и увеличить толщину линииесли вы хотите изобразить гистограмму.

library(tidyr)
library(dplyr)
library(ggplot2)
library(scales)
library(lubridate)

df <- data.frame(Date = rep(seq.Date(as.Date("2010-01-01"), as.Date("2010-12-01"), by="months"),times=2))
df$Site <- c(rep("Site.A",times = 12),rep("Site.B",times = 12))
df$Condition<- as.factor(c(0,0,0,0,1,1,1,1,0,0,0,0,
                           0,0,0,0,0,1,1,0,0,0,0,0))
df$Date <- ymd(df$Date)

ggplot(df) +
  geom_line(aes(y=Site,x=Date,color=Condition),size=10)+
  scale_x_date(labels = date_format("%b-%y"))

enter image description here

Примечание с использованием coord_flip() также не работает, ядумаю, что это вызывает проблему с датой, см. ниже темы:

как использоватьordin_carteisan иordin_flip вместе в ggplot2

В ggplot2 ,ordin_flip и свободных масштабах don 'т работать вместе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...