R: коробчатая диаграмма с 2 или более сериями

Мой фрейм данных прост (и, вероятно, не является строго фреймом данных):

   date MAE_f0 MAE_f1
   1  20140101           0.2           0.2
   2  20140102           1.9           0.1
   3  20140103           0.1           0.3
   4  20140104           7.8          15.9
   5  20140105           1.9           4.6
   6  20140106           0.8           0.8
   7  20140107           0.5           0.6
   8  20140108           0.2           0.2
   9  20140109           0.2           0.2
   10 20140110           0.8           1.1
   11 20140111           0.2           0.2
   12 20140112           0.4           0.4
   13 20140113           2.8           0.9
   14 20140114           5.4           5.8
   15 20140115           0.2           0.3
   16 20140116           4.9           3.1
   17 20140117           3.7           6.0
   18 20140118           1.4           2.1
   19 20140119           0.9           3.0
   20 20140120           0.2           3.6
   21 20140121           0.3           0.3
   22 20140122           0.4           0.4
   23 20140123           0.6           1.7
   24 20140124           6.1           4.7
   25 20140125           0.1           0.0
   26 20140126           7.4           4.9
   27 20140127           0.8           0.9
   28 20140128           0.3           0.3
   29 20140129           3.0           4.2
   30 20140130           9.9          17.3

Каждый день у меня есть 2 переменные: MAE для f0 и MAE для f1.

Я могу рассчитать частоту для моих двух переменных за весь период времени, используя "cut" с одинаковыми интервалами для обеих:

cut(mae.df$MAE_f0,c(0,2,5,10,50))

cut(mae.df$MAE_f1,c(0,2,5,10,50))

Хорошо. Теперь я могу использовать коробчатую диаграмму для построения зависимости переменной от ее частотного распределения:

boxplot(mae.df$MAE_f0~cut(mae.df$MAE_f0,c(0,2,5,10,50)))

boxplot(mae.df$MAE_f1~cut(mae.df$MAE_f1,c(0,2,5,10,50)))

Полученная коробчатая диаграмма (2) очень проста (но я не показываю ее, потому что у меня есть "репутация"): на x указаны интервалы частоты (0-2,2-5,5-10,10 -50), по y значение прямоугольной диаграммы для переменной MAE_f0 для каждого интервала.

Что ж, вопрос очень тривиальный: я хотел бы иметь только один прямоугольный график с обеими переменными MAE_f0 и MAE_f1 и его частотным распределением: я хотел бы иметь график с двумя прямоугольными диаграммами для каждого частотного интервала (я имею в виду: 2 для 0-2, 2 для 2-5 и так далее).

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

Надеюсь, мой вопрос не лишен: еще раз извините за это.

Умбе


person Umbe    schedule 05.01.2015    source источник
comment
Я думаю, что этот пост должен начать.   -  person Henrik    schedule 05.01.2015


Ответы (2)


Вот как бы я это сделал. Я думаю, имеет смысл сначала растопить ваши данные. Краткое руководство по объединению ваших данных доступно здесь.

# First, make this reproducible by using dput for the data frame
df <- structure(list(date = 20140101:20140130, MAE_f0 = c(0.2, 1.9, 0.1, 7.8, 1.9, 0.8, 0.5, 0.2, 0.2, 0.8, 0.2, 0.4, 2.8, 5.4, 0.2, 4.9, 3.7, 1.4, 0.9, 0.2, 0.3, 0.4, 0.6, 6.1, 0.1, 7.4, 0.8, 0.3, 3, 9.9), MAE_f1 = c(0.2, 0.1, 0.3, 15.9, 4.6, 0.8, 0.6, 0.2, 0.2, 1.1, 0.2, 0.4, 0.9, 5.8, 0.3, 3.1, 6, 2.1, 3, 3.6, 0.3, 0.4, 1.7, 4.7, 0, 4.9, 0.9, 0.3, 4.2, 17.3)), .Names = c("date", "MAE_f0", "MAE_f1"), row.names = c(NA, -30L), class = "data.frame")

require(ggplot2)
require(reshape2)

# Melt the original data frame
df2 <- melt(df, measure.vars = c("MAE_f0", "MAE_f1"))
head(df2)
#       date variable value
# 1 20140101   MAE_f0   0.2
# 2 20140102   MAE_f0   1.9
# 3 20140103   MAE_f0   0.1
# 4 20140104   MAE_f0   7.8
# 5 20140105   MAE_f0   1.9
# 6 20140106   MAE_f0   0.8

# Create a "cuts" variable with the correct breaks
df2$cuts <- cut(df2$value, 
                breaks = c(-Inf, 2, 5, 10, +Inf), 
                labels = c("first cut", "second cut", "third cut", "fourth cut"))
head(df2)
#       date variable value      cuts
# 1 20140101   MAE_f0   0.2 first cut
# 2 20140102   MAE_f0   1.9 first cut
# 3 20140103   MAE_f0   0.1 first cut
# 4 20140104   MAE_f0   7.8 third cut
# 5 20140105   MAE_f0   1.9 first cut
# 6 20140106   MAE_f0   0.8 first cut

# Plotting
ggplot(df2, aes(x = variable, y = value, fill = variable)) +
  geom_boxplot() +
  facet_wrap(~ cuts, nrow = 1)

Результат:

График результатов

person JasonAizkalns    schedule 05.01.2015

Вот один способ. Вы меняете свои данные. Затем в этом случае вы хотите добавить фальшивую точку данных. Я заметил, что нет точки данных для MAE_f0 для (10,50] (частота 10-50). Объедините ваши измененные данные и поддельные данные. Когда вы рисуете фигуру, используйте coord_cartesian с диапазоном значений y в исходном наборе данных. Надеюсь, это даст вам идеальную графику. Здесь ваши данные называются mydf

library(dplyr)
library(tidyr)
library(ggplot2)


mydf <- structure(list(V1 = 1:30, V2 = 20140101:20140130, V3 = c(0.2, 
1.9, 0.1, 7.8, 1.9, 0.8, 0.5, 0.2, 0.2, 0.8, 0.2, 0.4, 2.8, 5.4, 
0.2, 4.9, 3.7, 1.4, 0.9, 0.2, 0.3, 0.4, 0.6, 6.1, 0.1, 7.4, 0.8, 
0.3, 3, 9.9), V4 = c(0.2, 0.1, 0.3, 15.9, 4.6, 0.8, 0.6, 0.2, 
0.2, 1.1, 0.2, 0.4, 0.9, 5.8, 0.3, 3.1, 6, 2.1, 3, 3.6, 0.3, 
0.4, 1.7, 4.7, 0, 4.9, 0.9, 0.3, 4.2, 17.3)), .Names = c("V1", 
"V2", "V3", "V4"), class = "data.frame", row.names = c(NA, -30L
))

ana <- select(mydf, -V1) %>%
       rename(date = V2, MAE_f0 = V3, MAE_f1 = V4) %>%
       gather(variable, value, -date) %>%
       mutate(frequency = cut(value, breaks = c(-Inf,2,5,10,50)))

# Create a fake df
extra <- data.frame(date = 20140101,
                    variable = "MAE_f0",
                    value = 60,
                    frequency = "(10,50]")

new <- rbind(ana, extra)


ggplot(data = new, aes(x = frequency, y = value, fill = variable)) +
geom_boxplot(position = "dodge") +
coord_cartesian(ylim = range(ana$value) + c(-0.25, 0.25))

введите описание изображения здесь

person jazzurro    schedule 05.01.2015