R:2个或更多系列的箱形图

时间:2015-01-05 14:56:02

标签: r ggplot2 dataframe reshape boxplot

我的数据框很简单(可能不是严格意义上的数据框):

   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

每天我都有两个变量:MAE代表f0,MAE代表f1。

我可以使用“cut”以相同的间隔计算整个时间段内我的2个变量的频率:

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

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

好。现在我可以使用boxplot来绘制变量与其频率分布的关系:

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个箱图的情节(我的意思是:2表示0-2,2表示2-5,依此类推。)

我知道我对R,数据框架等方面的知识非常差,事实上,我遗漏了一些关于这些论点的重要内容,尤其是关于数据框架和重塑的内容!对不起提前做好了!但是我在stackoverflow中看到了一些关于分组boxplot的好例子,都没有时间变量,我无法弄清楚如何调整数据帧来做到这一点。

我希望我的问题不会错位:再次抱歉。

Umbe

2 个答案:

答案 0 :(得分:0)

我将如何做到这一点。我认为首先融化您的数据是有意义的。有关融合数据的快速教程,请here

# 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)

结果:

Resulting Graph

答案 1 :(得分:0)

这是一种方法。您重塑数据。然后,您希望在这种情况下添加假数据点。我注意到MAE_f0 (10,50]没有数据点(频率10-50)。合并您重新塑造的数据和假数据。绘制图形时,请使用原始数据集中y值范围的coord_cartesian。希望这能为您提供理想的图形。在这里,您的数据称为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))

enter image description here