创建条形图以表示ggplot2中的时间序列

时间:2019-02-25 13:25:43

标签: r date ggplot2

我有一个包含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轴)的状态-用不同颜色指示的状态。我猜想某种翻转的barplot可以做到这一点,但是我无法弄清楚如何告诉ggplot2按时间顺序识别值,而不是针对每个条件求和。到目前为止,这是我的尝试,显然不能满足我的需要。

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

所以我有2个问题。 首先,我如何告诉ggplot识别条件随时间的变化,而不仅仅是在传统的堆叠条形图中将每个条件分组?

其次,似乎ggplot将日期转换为数字值,我将如何重新格式化x轴以显示时间段,例如我尝试通过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 :(得分:1)

考虑到您不想汇总数据并且需要“时间”上的可视化,使用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()也不起作用,我认为这会导致Date问题,请参见以下主题:

how to use coord_carteisan and coord_flip together in ggplot2

In ggplot2, coord_flip and free scales don't work together