我刚刚开始使用R,并尝试找出如何使用ggplot在箱形图上添加均值和中值标签。
我有一个数据集:单位,季度,天数:
dset <- read.table(text='Unit Quarter Days Z
HH 1Q 25 Y
PA 1Q 28 N
PA 1Q 10 Y
HH 1Q 53 Y
HH 1Q 12 Y
HH 1Q 20 Y
HH 1Q 43 N
PA 1Q 11 Y
PA 1Q 66 Y
PA 1Q 54 Y
PA 2Q 19 N
PA 2Q 46 Y
PA 2Q 37 Y
HH 2Q 22 Y
HH 2Q 67 Y
PA 2Q 45 Y
HH 2Q 48 Y
HH 2Q 15 N
PA 3Q 12 Y
PA 3Q 53 Y
HH 3Q 58 Y
HH 3Q 41 N
HH 3Q 18 Y
PA 3Q 26 Y
PA 3Q 12 Y
HH 3Q 63 Y
', header=TRUE)
我需要按单位和季度显示数据,并创建一个显示均值和中值的箱线图。
我的箱线图代码:
ggplot(data = dset, aes(x = Quarter
,y = Days, fill = Quarter)) +
geom_boxplot(outlier.shape = NA) +
facet_grid(. ~ Unit) + # adding another dimension
coord_cartesian(ylim = c(10, 60)) + #sets the y-axis limits
stat_summary(fun.y=mean, geom="point", shape=20, size=3, color="red", fill="red") + #adds average dot
geom_text(data = means, aes(label = round(Days, 1), y = Days + 1), size = 3) + #adds average labels
geom_text(data = medians, aes(label = round(Days, 1), y = Days - 0.5), size = 3) + #adds median labels
xlab(" ") +
ylab("Days") +
ggtitle("Days") +
theme(legend.position = 'none')
我可以使用geom_text函数添加均值和中位数标签,但只能添加一个维度(“四分之一”),并且它需要事先计算均值和中位数变量:
means <- aggregate(Days ~ Quarter, dset, mean)
medians <- aggregate(Days ~ Quarter, dset, median)
效果很好,我设法通过“单位”和“季度”来计算均值和中值:
means <- aggregate(dset[, 'Days'], list('Unit' = dset$Unit, 'Quarter' = dset$Quarter), mean)
medians <- aggregate(dset[, 'Days'], list('Unit' = dset$Unit, 'Quarter' = dset$Quarter), median)
但是我不知道如何将这些变量传递给geom_text函数以显示均值和中位数的标签。也许我应该以不同的方式计算均值和中位数,或者还有其他选择如何添加这些标签。
如有任何建议,将不胜感激!
答案 0 :(得分:1)
看起来像这样的问题是,当您同时通过“单位”和“季度”计算平均值和中位数时,以前称为“天”的变量现在称为“ x”。因此,只需更新您的geom_text命令即可反映这一点。
ggplot(data = dset, aes(x = Quarter, y = Days, fill = Quarter)) +
geom_boxplot(outlier.shape = NA) +
facet_grid(. ~ Unit) + # adding another dimension
coord_cartesian(ylim = c(10, 60)) + #sets the y-axis limits
stat_summary(fun.y=mean, geom="point", shape=20, size=3, color="red", fill="red") + #adds average dot
geom_text(data = means, aes(label = round(x, 1), y = x + 1), size = 3) + #adds average labels
geom_text(data = medians, aes(label = round(x, 1), y = x - 0.5), size = 3) + #adds median labels
xlab(" ") +
ylab("Days") +
ggtitle("Days") +
theme(legend.position = 'none')
答案 1 :(得分:1)
为回答第二个问题,我认为您正在寻找类似的东西。此代码产生相同的图表,但仅限于子样本Z = Y
。
means <- aggregate(dset[, 'Days'][dset$Z=="Y"], list('Unit' = dset$Unit[dset$Z=="Y"], 'Quarter' = dset$Quarter[dset$Z=="Y"]), mean)
medians <- aggregate(dset[, 'Days'][dset$Z=="Y"], list('Unit' = dset$Unit[dset$Z=="Y"], 'Quarter' = dset$Quarter[dset$Z=="Y"]), median)
ggplot(data = dset[dset$Z=="Y",], aes(x = Quarter, y = Days, fill = Quarter)) +
geom_boxplot(outlier.shape = NA) +
facet_grid(. ~ Unit) + # adding another dimension
coord_cartesian(ylim = c(10, 60)) + #sets the y-axis limits
stat_summary(fun.y=mean, geom="point", shape=20, size=3, color="red", fill="red") + #adds average dot
geom_text(data = means, aes(label = round(x, 1), y = x + 1), size = 3) + #adds average labels
geom_text(data = medians, aes(label = round(x, 1), y = x - 0.5), size = 3) + #adds median labels
xlab(" ") +
ylab("Days") +
ggtitle("Days") +
theme(legend.position = 'none')