我希望在由 生成的箱线图中每个框上方显示一个标签ggplot2。
例如:
#Example data
test = c("A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B")
patient = c(1, 1, 2, 2, 3, 3, 1, 1, 2, 2, 3, 3)
result = c(5, 7, 2 ,4, 6, 7, 3, 5, 5, 6, 2 ,3)
data <- tibble(test, patient, result)
#Labels I want to include
Alabs = c(1, 3, 500)
Blabs = c(8, 16, -32)
#Plot data
ggplot(data, aes(x = factor(patient), y = result, color = factor(test))) +
geom_boxplot(outlier.shape = 1)
Run Code Online (Sandbox Code Playgroud)
给出情节:
我想为Alabs第一个患者打印红色框上方的第一个元素,Alabs为第二个患者打印红色框上方的第二个元素,Blabs为第一个患者打印蓝色框上方的第一个元素,等等。
我该怎么做呢?
我会制作一个单独的标签数据集来添加标签。
labs = tibble(test = rep(LETTERS[1:2], each = 3),
patient = c(1, 2, 3, 1, 2, 3),
labels = c(1, 3, 500, 8, 16, -32) )
test patient labels
<chr> <dbl> <dbl>
1 A 1 1
2 A 2 3
3 A 3 500
4 B 1 8
5 B 2 16
6 B 3 -32
Run Code Online (Sandbox Code Playgroud)
上面包含了关于x轴和faceting变量的所有信息。它缺少的是有关 y 轴上文本位置的信息。为了将它们放在框上方,我们可以计算每个因子组合的最大值加上 y 位置的小值(虽然geom_text有一个有用的nudge_y参数,但它在躲避时不起作用)。
我通过dplyr对每组进行摘要,然后将 y 位置值加入到标签数据集。
library(dplyr)
labeldat = data %>%
group_by(test, patient) %>%
summarize(ypos = max(result) + .25 ) %>%
inner_join(., labs)
Run Code Online (Sandbox Code Playgroud)
现在您可以geom_text使用标签数据集添加图层。要以与箱线图相同的方式避免这些,请使用position_dodge. 为了防止字母出现在我使用的图例中show.legend = FALSE。
ggplot(data, aes(x = factor(patient), y = result, color = test)) +
geom_boxplot(outlier.shape = 1) +
geom_text(data = labeldat, aes(label = labels, y = ypos),
position = position_dodge(width = .75),
show.legend = FALSE )
Run Code Online (Sandbox Code Playgroud)