我想为直方图中的某些观察添加“id”注释。
到目前为止,我可以毫无问题地添加注释,但我希望注释的 'y' 位置是 bin + 1 的计数(出于审美原因)。
这是我到目前为止:
library(tidyverse)
library(ggrepel)
selected_obs <- c("S10", "S100", "S245", "S900")
set.seed(0)
values <- rnorm(1000)
plot_df <- tibble(id = paste0("S", 1:1000),
values = values) %>%
mutate(obs_labels = ifelse(id %in% selected_obs, id, NA))
ggplot(plot_df, aes(values)) +
geom_histogram(binwidth = 0.3, color = "white") +
geom_label_repel(aes(label = obs_labels, y = 100))
Run Code Online (Sandbox Code Playgroud)
我已经看到多个答案处理使用geom_text(stat = count", aes(y=..count.., label=..count..)
.
基于此,我尝试了这两种解决方法,但没有成功:
geom_label_repel(stat = "count", aes(label = obs_labels, y = ..count..))
产生:“错误:geom_label_repel 需要以下缺失的美学:标签”geom_label_repel(aes(label = obs_labels, y = ..count..))
产生“错误:美学必须是有效的计算统计数据。有问题的美学:y = ..count ...您是否在错误的图层中映射了您的统计数据?”。任何人都可以在这里有所启发?
这可能是一个有点误导性的可视化,因为您正在标记一个唯一的 ID,但通过将此标签定位到计数高度,您表明该 ID 经常被计数。无论如何。
最直接的选项是手动计算您的 ID 所属的 bin,然后对该 bin 进行计数,然后使用此数据来设置标签的 x 和 y。
不幸的是,我必须在线使用 R 并且无法创建一个好的表示,因此包括一个屏幕截图。但代码应该是可重现的,因为它是在线运行的
library(tidyverse)
library(ggrepel)
selected_obs <- c("S10", "S100", "S245", "S900")
set.seed(0)
values <- rnorm(1000)
plot_df <- tibble(id = paste0("S", 1:1000),
values = values) %>%
mutate(obs_labels = ifelse(id %in% selected_obs, id, NA),
bins = as.factor( as.numeric( cut(values, 30)))) # cutting into 30 bins
label_df<- plot_df %>% filter(id %in% selected_obs) %>% left_join(plot_df, by = 'bins') %>%
group_by(values = values.x, obs_labels = obs_labels.x) %>% count
ggplot(plot_df, aes(values)) +
geom_histogram(color = "white") + # removed your bin argument, as to default to 30
geom_label(data = label_df, aes(label = obs_labels, y = n))
Run Code Online (Sandbox Code Playgroud)
标签位置不太完美 - 这是因为我选择切割成 30 个相等的分箱,并且cut
和之间的分箱可能略有不同histogram
。这可能需要一些调整,具体取决于您的垃圾箱的大小,以及是否包括上/下边距。
PS 切割成相等的垃圾箱的信用来自用户 pedrosaurio 的回答