ggplot2:在R中具有scale_x_date轴的多个因子boxplot

时间:2013-11-19 14:23:46

标签: r date ggplot2 boxplot

我想用ggplot2创建一个多变量的boxplot时间系列,我需要一个带有日期的boxplot位置函数的x轴。

我创建了一个交互矩阵,其中包含针对NDVI和不同试验组绘制的因子Treatment x Date的组合:

在这里你可以找到一些最小的数据:

dat<-"Treatment  Trial.group    Date    NDVI
HighN   A   14/06/2013  0.27522123
HighN   A   14/06/2013  0.259781926
HighN   A   14/06/2013  0.175982276
LowN    A   14/06/2013  0.193604644
LowN    A   14/06/2013  0.261191793
LowN    A   14/06/2013  0.273672853
HighN   B   14/06/2013  0.192144884
HighN   B   14/06/2013  0.283013594
HighN   B   14/06/2013  0.230556973
LowN    B   14/06/2013  0.233952974
LowN    B   14/06/2013  0.261718465
LowN    B   14/06/2013  0.216450145
HighN   A   22/06/2013  0.37522123
HighN   A   22/06/2013  0.359781926
HighN   A   22/06/2013  0.275982276
LowN    A   22/06/2013  0.293604644
LowN    A   22/06/2013  0.361191793
LowN    A   22/06/2013  0.373672853
HighN   B   22/06/2013  0.292144884
HighN   B   22/06/2013  0.383013594
HighN   B   22/06/2013  0.330556973
LowN    B   22/06/2013  0.333952974
LowN    B   22/06/2013  0.361718465
LowN    B   22/06/2013  0.316450145
HighN   A   24/06/2013  0.47522123
HighN   A   24/06/2013  0.459781926
HighN   A   24/06/2013  0.375982276
LowN    A   24/06/2013  0.393604644
LowN    A   24/06/2013  0.461191793
LowN    A   24/06/2013  0.473672853
HighN   B   24/06/2013  0.392144884
HighN   B   24/06/2013  0.483013594
HighN   B   24/06/2013  0.430556973
LowN    B   24/06/2013  0.433952974
LowN    B   24/06/2013  0.461718465
LowN    B   24/06/2013  0.416450145"

以下是导入和创建绘图的代码:

NDVI_ts <- read.table(text=dat, header = TRUE)
library(ggplot2)
library(scales)
interact<-interaction(NDVI_ts$Treatment, NDVI_ts$Date, sep=" : ")
ggplot(data=NDVI_ts, aes(x=interact, y=NDVI)) + 
geom_boxplot(aes(fill = Trial.group), width = 0.6) + 
theme_bw() + theme(axis.text.x = element_text(angle = 90, hjust = 1)) 

此代码给出了以下boxplot,这很好,但x轴没有链接到日期:(NDVI ~ Treatment + Date + Trial.group)

enter image description here

我知道我通常可以这样做:

q + scale_x_date(breaks="1 week", labels=date_format("%d-%b"))

但是interact矩阵是一个因素,不能定义为时间对象,因此不起作用。我有以下错误:

  

错误:输入无效:date_trans仅适用于类Date的对象

我怎么能有按日期定义的多变量箱图位置?

NDVI_ts $ Date已被定义为R中的日期对象。

1 个答案:

答案 0 :(得分:3)

在“处理”和“日期”之间创建interaction的x轴可以有助于排列不同值的分组变量的框。但是,正如您所注意到的,当原始Date轴转换为“复合”因子时,控制轴的外观要困难得多。

这是一种将x轴保持为Date格式的替代方案。通过创建两种不同颜色的调色板来区分“处理”的两个级别。 “治疗”中的组由不同颜色的阴影分隔。使用group参数对框进行分组。

library(ggplot2)
library(scales)
library(RColorBrewer)

# convert Date to class 'Date'
NDVI_ts$date <- as.Date(NDVI_ts$Date, format = "%d/%m/%Y")

# A possible way to create suitable colours for the boxes
# create one palette of colours for each level of Treatment
# e.g. blue colour for 'HighN', red for 'LowN'
# one colour for each level of Trial.group

# number of levels of Trial.group
n_col <- length(unique(NDVI_ts$Trial.group))

# create blue colours
blues <- brewer.pal(n = n_col, "Blues")
# Warning message:
#   In brewer.pal(n = n_col, "Blues") :
#   minimal value for n is 3, returning requested palette with 3 different levels

# create red
reds <- brewer.pal(n = n_col, "Reds")

# Here I manually pick the first and the last 'blue' and 'red'
# From the plot in the question, it seems like you have more than two levels of Trial.group
# so you should be able to use the 'blues' and 'reds' vectors in scale_fill_manual.

# group boxes by date, Trial.group and Treatment
ggplot(data = NDVI_ts, aes(x = date, y = NDVI)) +
  geom_boxplot(aes(fill = interaction(Trial.group, Treatment),
                   group = interaction(factor(date), Trial.group, Treatment))) + 
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_x_date(breaks = "1 week", labels = date_format("%d-%b")) +
  scale_fill_manual(name = "Treatment",
                    values = c("#FEE0D2", "#DE2D26", "#DEEBF7", "#3182BD"))
  #  scale_fill_manual(values = c(reds, blues))

enter image description here