2016-08-06 3 views
0

Я хотел бы создать коробку для временного ряда, где я мог бы покрасить backgroudn с прямоугольниками (geom_rect) и указать метки как символ.geom_boxplot: поместите метки «символ» на непрерывной оси x с прямоугольниками (geom_rect) в качестве фона

Я могу построить boxplot, однако, как мне нужна непрерывная шкала для определения прямоугольников, я не в состоянии построить метки, как символ

Здесь я поставил код, который я написал:

1: Создать набор данных

# load packages 
library (dplyr) 
library (ggplot2) 
Order <- rep (seq (1:24), 100) 
Values <- runif (2400, 0, 1) 
Season <- rep ((rep (c(rep("Spring", 3), rep ("Summer", 3), rep ("Autumn", 3), rep ("Winter", 3)),2)), 100) 
Date <- rep((c("D-70", "J-71", "F-71", "M-71", "Ap-71", "May-71", "Jun-71", "Jul-71", "Au-71", "S-71", "O-71", "N-71", 
      "D-71", "J-72", "F-72", "M-72", "Ap-72", "May-72", "Jun-72", "Jul-72", "Au-72", "S-72", "O-72", "N-72")), 100) 
df <- data.frame (Order, Values, Season, Date) ; head (df) 

Определить периоды, которые я хочу, чтобы цвет прямоугольников

# Indicate the seasons for the X axis 
Seasons_plot <- df %>% distinct(Date) %>% arrange (Order) # Select the position of each season for plotting it 
start_spring <- which(Seasons_plot$Season == "Spring") ; end_spring <- start_spring + 1 
start_summer <- which(Seasons_plot$Season == "Summer") ; end_summer <- start_summer + 1 
start_autumn <- which(Seasons_plot$Season == "Autumn") ; end_autumn <- start_autumn + 1 
start_winter <- which(Seasons_plot$Season == "Winter") ; end_winter <- start_winter + 1 

n <- max (length(start_spring), length(start_summer), length(start_autumn), length(start_winter), 
      length(end_spring), length(end_summer), length(end_autumn), length(end_winter)) 

length(start_spring) <- n ; length(start_summer) <- n ; length(start_autumn) <- n; length(start_winter) <- n 
length(end_spring) <- n; length(end_summer) <- n; length(end_autumn) <- n; length(end_winter) <- n 

#Indicate the size (y axis) of the rectangle 
ymin_season <- rep(0, n) 
ymax_season <- rep(1, n) 

# Create a dataframe for indicating the position of the rectangles 
shade <- data.frame (start_spring, end_spring, 
        start_summer, end_summer, 
        start_autumn, end_autumn, 
        start_winter, end_winter, 
        ymin_season, ymax_season) 

Выберите ярлыки для печати, чтобы облегчить визуализацию (например, 1 каждые 4)

labels <- Seasons_plot$Date 
labels 
# Select the number of the labels to plot 
labels_selected <- seq(from=1, to=length(labels), by=4) 
labels_plot <- c() 
for (i in 1:length(labels)){ 
    if (i %in% labels_selected){ 
    labels_plot[i] <- as.character (labels [i]) 
    } else { 
    labels_plot[i] <- c(" ") 
    } 
} 
labels_plot 

Постройте boxplot

library (plyr) 
ggplot (df) + 
    geom_boxplot(aes(Order, Values, group=round_any(Order, 1)), outlier.colour = NA) + 
    geom_rect (data=shade, aes(xmin=start_spring, xmax=end_spring, ymin=ymin_season, ymax=ymax_season), fill="green", alpha=0.05) + 
    geom_rect (data=shade, aes(xmin=start_summer, xmax=end_summer, ymin=ymin_season, ymax=ymax_season), fill="blue", alpha=0.05) + 
    geom_rect (data=shade, aes(xmin=start_autumn, xmax=end_autumn, ymin=ymin_season, ymax=ymax_season), fill="orange", alpha=0.05) + 
    geom_rect (data=shade, aes(xmin=start_winter, xmax=end_winter, ymin=ymin_season, ymax=ymax_season), fill="white", alpha=0.05) + 
    scale_x_discrete (labels=labels_plot) 
detach("package:plyr", unload=TRUE) 

Вы знаете, как я могу поставить метки в качестве символа в этом сюжете? или как я мог бы смешивать два сюжета (один для прямоугольников, а другой для коробки с надписями)?

Спасибо заранее,

ответ

1

Я думаю, ваша проблема в том, что ДФ $ Заказ был class integer, если вы настраиваете:

df$Order <- as.factor(df$Order) 

Ваш существующий код работает как шарм. (Я опустил group = plyr::round_any(Order, 1)) PS Синтаксис package::function - отличный способ использовать определенные функции пакета без манипуляции с загрузкой/выгрузкой пакета. Любые способы это то, что я побежал:

df$Order <- as.factor(df$Order) 

ggplot (df) + 
    geom_boxplot(aes(Order, Values),outlier.colour = NA) + 
    geom_rect (data=shade, aes(xmin=start_spring, xmax=end_spring, 
    ymin=ymin_season, ymax=ymax_season), fill="green", alpha=0.05) + 
    geom_rect (data=shade, aes(xmin=start_summer, xmax=end_summer, 
    ymin=ymin_season, ymax=ymax_season), fill="blue", alpha=0.05) + 
    geom_rect (data=shade, aes(xmin=start_autumn, xmax=end_autumn, 
    ymin=ymin_season, ymax=ymax_season), fill="orange", alpha=0.05) + 
    geom_rect (data=shade, aes(xmin=start_winter, xmax=end_winter, 
    ymin=ymin_season, ymax=ymax_season), fill="white", alpha=0.05) + 
    scale_x_discrete(labels=labels_plot) 

И эта красота выскочила:

enter image description here

Смежные вопросы