您可以通过创建一个新的分组变量(我们将其称为group
),对于每个 bin,取值为key
对于前两个级别key
or other
对于其他三个级别key
。为了实现这一点,您需要在绘制数据之前对数据进行分类和统计,然后创建新的group
列并将其用作fill
审美在ggplot
.
library(dplyr)
library(ggplot2)
# Set a seed for reproducibility
set.seed(59)
tmp_df <-
data.frame(a = rnorm(100, 0, 1),
b = rnorm(100, 0.5, 1),
c = rnorm(100, -0.5, 1),
d = rnorm(100, 1, 1),
e = rnorm(100, -1, 1)) %>%
tidyr::gather()
在下面的代码中,我们对数据进行分箱并创建新的分组变量。我使用了 0.2 个单位宽的垃圾箱,标签等于垃圾箱的中点。要创建group
列,我们使用rank
找到两个最常见的值key
在每个垃圾箱中,并将其余的设置为“其他”。
tmp_df = tmp_df %>%
group_by(key,
bins=cut(value, seq(-10,10,0.2), labels=seq(-9.9,9.9,0.2))) %>%
tally %>%
group_by(bins) %>%
mutate(group = ifelse(key %in% key[rank(-n, ties="first") %in% 1:2], key, "other")) %>%
arrange(bins, key)
现在,对于我们使用的情节geom_bar
我们用新的填充group
我们在上面创建的列。另外,我们转换bins
(箱标签)从因子到数字,因此 x 轴将是连续的,而不是离散的。
tmp_df %>%
ungroup %>%
mutate(bins = as.numeric(as.character(bins))) %>%
ggplot(aes(x=bins, y=n, fill = group)) +
geom_bar(stat='identity') +
scale_fill_manual(values=c(hcl(seq(15,375,length.out=6)[1:5],100,65),"black"))
让我知道这是否是您的想法。