R:具有 2 个或更多系列的箱线图

R: box plot with 2 or more series

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

   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" 计算整个时间段内我的 2 个变量的频率,两者的间隔相同:

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)非常简单(但我没有显示它因为我已经"reputation"):在x上有频率间隔(0-2,2- 5,5-10,10-50),在 y 上每个区间的变量 MAE_f0 的箱线图值。

好吧,这个问题很简单:我只想有一个箱线图,有两个变量 MAE_f0 和 MAE_f1 以及它的频率分布:我想要的是每个频率间隔有 2 个箱线图的图(我的意思是:2 代表 0-2,2 代表 2-5 等等)。

我知道我在 R、数据框等方面的知识很差,事实上,我遗漏了一些关于这些论点的重要内容,特别是关于数据框和重塑!提前为此感到抱歉!但我在 Whosebug 中看到了一些关于分组箱线图的好例子,所有这些都没有时间变量,而且我无法弄清楚如何调整我的数据框来做到这一点。

希望我的问题没有错:再次抱歉。

翁贝

下面是我将如何做到这一点。我认为首先融化你的数据是有意义的。提供了有关融化数据的快速教程 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)

结果:

这是一种方法。你重塑你的数据。然后,您想在这种情况下添加一个假数据点。我注意到 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))