使用 stat_summary 在箱线图上标记中线
Use stat_summary to label median line on boxplot
我有一个函数,其中我试图使用 stat_summary()
在 geom_boxplot()
上绘制中值线正上方的中值。我已经减少了我的问题并创建了一个玩具示例来简化但保留上下文。
library(ggplot2)
set.seed(20191120)
dat <- data.frame(var = sample(c("a", "b"),
50,
replace = TRUE),
value = rpois(50, 5))
lims <- c(0, 10)
myplot <- function(DATA, YLIMS) {
ggplot(data = DATA,
aes(x = var)) +
geom_boxplot(aes(y = value),
outlier.shape = NA,
coef = 0) +
stat_summary(aes(y = ifelse(value > (YLIMS[2]*0.9), # if median in top10% of plot window
(value - (YLIMS[2]/10)), # put it below bar
(value + (YLIMS[2]/10))), # else put it above
label = round(..y.., 2)), #round(median(value), 2))
fun.y = median,
geom = "text") +
coord_cartesian(ylim = YLIMS)
}
myplot(dat, lims)
我的实际地块有几个方面,各种范围,一些中位数位于范围的顶部或底部。如您所见,我排除了晶须和异常值。这就是 YLIMS 参数用于缩放和关注框并排除未使用的图 space 的地方。我还使用这些 YLIMS 值将标签定位在范围的 +/- 10% 处,效果非常好。
我尝试使用 ..y.. 值来获取 stat_summary(aes())
的标签参数的中值,但它取而代之的是新值。从图中可以看出,我们希望两个标签都是“5”,但它们是“6”,因为添加了 10 的 10%。
我也尝试重新计算中位数(正如您看到的注释掉的那样),但这采用了所有数据的简单中位数并且不控制 groupings/facets/etc。
我知道如何重构我的代码来计算以创建数据中的 y 标签和位置的值,或者通过聚合和使用箱线图的身份,但我想知道是否有一种方法可以计算就像我的尝试一样,这种内联方式即将完成。
解决这个问题的关键不是试图调整值,而是使用postion=position_nudge()
选项移动位置。
library(ggplot2)
set.seed(20191120)
dat <- data.frame(var = sample(c("a", "b"), 50, replace = TRUE),
value = rpois(50, 5))
lims <- c(0, 10)
myplot <- function(DATA, YLIMS) {
ggplot(data = DATA, aes(x = var)) +
geom_boxplot(aes(y = value), outlier.shape = NA, coef = 0) +
stat_summary(aes(y = value , label = round(..y.., 2)),
fun.y = median, geom = "text",
position=position_nudge(y = ifelse(value > (YLIMS[2]*0.9), #if median in top 10% of plot window
(-YLIMS[2]/10), #put it below bar
(YLIMS[2]/10)), x = 0)) +
coord_cartesian(ylim = YLIMS)
}
myplot(dat, lims)
我有一个函数,其中我试图使用 stat_summary()
在 geom_boxplot()
上绘制中值线正上方的中值。我已经减少了我的问题并创建了一个玩具示例来简化但保留上下文。
library(ggplot2)
set.seed(20191120)
dat <- data.frame(var = sample(c("a", "b"),
50,
replace = TRUE),
value = rpois(50, 5))
lims <- c(0, 10)
myplot <- function(DATA, YLIMS) {
ggplot(data = DATA,
aes(x = var)) +
geom_boxplot(aes(y = value),
outlier.shape = NA,
coef = 0) +
stat_summary(aes(y = ifelse(value > (YLIMS[2]*0.9), # if median in top10% of plot window
(value - (YLIMS[2]/10)), # put it below bar
(value + (YLIMS[2]/10))), # else put it above
label = round(..y.., 2)), #round(median(value), 2))
fun.y = median,
geom = "text") +
coord_cartesian(ylim = YLIMS)
}
myplot(dat, lims)
我的实际地块有几个方面,各种范围,一些中位数位于范围的顶部或底部。如您所见,我排除了晶须和异常值。这就是 YLIMS 参数用于缩放和关注框并排除未使用的图 space 的地方。我还使用这些 YLIMS 值将标签定位在范围的 +/- 10% 处,效果非常好。
我尝试使用 ..y.. 值来获取 stat_summary(aes())
的标签参数的中值,但它取而代之的是新值。从图中可以看出,我们希望两个标签都是“5”,但它们是“6”,因为添加了 10 的 10%。
我也尝试重新计算中位数(正如您看到的注释掉的那样),但这采用了所有数据的简单中位数并且不控制 groupings/facets/etc。
我知道如何重构我的代码来计算以创建数据中的 y 标签和位置的值,或者通过聚合和使用箱线图的身份,但我想知道是否有一种方法可以计算就像我的尝试一样,这种内联方式即将完成。
解决这个问题的关键不是试图调整值,而是使用postion=position_nudge()
选项移动位置。
library(ggplot2)
set.seed(20191120)
dat <- data.frame(var = sample(c("a", "b"), 50, replace = TRUE),
value = rpois(50, 5))
lims <- c(0, 10)
myplot <- function(DATA, YLIMS) {
ggplot(data = DATA, aes(x = var)) +
geom_boxplot(aes(y = value), outlier.shape = NA, coef = 0) +
stat_summary(aes(y = value , label = round(..y.., 2)),
fun.y = median, geom = "text",
position=position_nudge(y = ifelse(value > (YLIMS[2]*0.9), #if median in top 10% of plot window
(-YLIMS[2]/10), #put it below bar
(YLIMS[2]/10)), x = 0)) +
coord_cartesian(ylim = YLIMS)
}
myplot(dat, lims)