r - 用 ggrepel 和抖动点标记多面图
问题描述
我正在尝试绘制三个箱线图并始终标记 2 个最高值。
我尝试创建一个位置元素并使用它来获得点和标签的相同位置,但不知何故这不起作用。
set.seed(1)
df <-
data.frame(a=rep(letters, 3),
b=LETTERS[1:3],
int=runif(78, 15, 30))
jitter_pos <- position_jitter(width=.4, seed = 1)
ggplot(df,
aes(1, int,
color=b)) +
geom_point(position=jitter_pos) +
geom_boxplot(alpha=.3, outlier.shape=NA, fill=NA, color='#993404') +
facet_wrap(~ b) +
guides(color=FALSE) +
geom_label_repel(data=df %>%
group_by(b) %>%
arrange(desc(int)) %>%
slice(1:2),
aes(label=a),
size=2.5, color='black',
fill='#FFFFFF33',
box.padding=1,
position=jitter_pos)
我很确定这只是一个小错误,但不知何故我找不到我的错误。标签与点位置不匹配。
也许更好的解决方案是b
在 x 轴上并以jitterdodge
某种方式使用,但这并没有起作用,所以我试图让它与方面一起运行。所以没有什么对我有用。
解决方案
您的错误在于position_jitter
的行为,这个问题在这个 github 问题中详细讨论。
ggrepel 作者建议的解决方案是在数据框中添加一个显式label
列,其中要省略的行为空字符串:
library(ggplot2)
library(ggrepel)
library(tidyverse)
set.seed(1)
df <-
data.frame(a=rep(letters, 3),
b=LETTERS[1:3],
int=runif(78, 15, 30)) %>%
group_by(b) %>%
mutate(label = if_else(rank(-int) %in% 1:2, as.character(a), ""))
jitter_pos <- position_jitter(width=.4, height = 0, seed = 1)
ggplot(df,
aes(1, int,
color=b)) +
geom_jitter(position=jitter_pos) +
geom_boxplot(alpha=.3, outlier.shape=NA, fill=NA, color='#993404') +
guides(color=FALSE) +
facet_wrap(~ b) +
geom_label_repel(aes(x=1, y=int, label=label),
size=2.5, color='black',
fill='#FFFFFF33',
box.padding=1,
position=jitter_pos)
由reprex 包(v0.3.0)于 2020-09-01 创建
推荐阅读
- intellij-idea - 有没有办法在 Intellij Scene Builder 中包含 JavaFX controlsFX?
- html - 在伪元素在 chrome 和 firefox 上出现不同之前
- swift - 带有 if 条件的 Swift 映射函数
- java - Spring hibernate CrudRepository 根据唯一约束更新保存方法
- java - 有扩展网址吗?
- php - 从另一个驱动器上的文档根目录连接到 XAMPP MySQL 数据库
- javascript - 如何在 Vue 中的组件之间共享一些代码
- ios - UIView.transition -> Error Unexpectedly found nil
- html - 视口宽度大于 100 的 CSS @media 打印正文会缩小内容,但在 Safari 上不会
- c++ - 具有公共内存区域的类数组对象