我想用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)
我知道我通常可以这样做:
q + scale_x_date(breaks="1 week", labels=date_format("%d-%b"))
但是interact
矩阵是一个因素,不能定义为时间对象,因此不起作用。我有以下错误:
错误:输入无效:date_trans仅适用于类Date的对象
我怎么能有按日期定义的多变量箱图位置?
NDVI_ts $ Date已被定义为R中的日期对象。
答案 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))