为部分数据的“颜色”和“填充”实施相同的调色板

时间:2019-01-16 09:59:54

标签: r ggplot2

具有以下示例数据集:

set.seed(20)
N <- 20
df1 <- data.frame(x = rnorm(N), 
                  y = rnorm(N), 
                  grp = paste0('grp_', sample(1:500, N, T)), 
                  lab = sample(letters, N, T))

#        x      y     grp   lab
# 1   1.163  0.237 grp_104   w
# 2  -0.586 -0.144 grp_448   y
# 3   1.785  0.722  grp_31   m
# 4  -1.333  0.370 grp_471   z
# 5  -0.447 -0.242 grp_356   o

我想绘制所有点,但仅标记它们的子集(例如,那些df1$x>0)。当我对color=grpgeom_point使用相同的geom_text美感时,效果很好:

ggplot(df1, aes(x=x,y=y,color=grp))+
  geom_point(size=4) +
  geom_text(aes(label=lab),data=df1[df1$x>1,],size=5,hjust=1,vjust=1)+
  theme(legend.position="none")

example1

但是如果我要将点设计更改为fill=grp,标签的颜色将不再匹配:

ggplot(df1, aes(x=x,y=y))+
  geom_point(aes(fill=grp),size=4,shape=21) + 
  geom_text(aes(label=lab,color=grp),data=df1[df1$x>1,],size=5,hjust=1,vjust=1)+
  theme(legend.position="none")

example2

我理解调色板是不同的,因为子集的级别与整个数据集的级别不同。但是,使用同一调色板强制实施的最简单解决方案是什么?

2 个答案:

答案 0 :(得分:1)

问题是由文本和填充颜色的不同因素级别引起的。我们可以通过在drop = FALSE中使用scale_*_discrete来避免降低未使用的因子水平:

ggplot(df1, aes(x=x,y=y))+
  geom_point(aes(fill=grp),size=4,shape=21) +
  geom_text(aes(label=lab,color=grp),data=df1[df1$x>1,],size=5,hjust=1,vjust=1)+
  theme(legend.position="none") +
  scale_fill_discrete(drop = F) +
  scale_colour_discrete(drop = F)

enter image description here


更新

对于真实数据,我们需要确保grp实际上是factor

# Load sample data
load("df1.Rdat")

# Make sure `grp` is a factor
library(tidyverse)
df1 <- df1 %>% mutate(grp = factor(grp))
# Or in base R
# df1$grp = factor(df1$grp)

# Same as before
ggplot(df1, aes(x=x,y=y))+
  geom_point(aes(fill=grp),size=4,shape=21) +
  geom_text(aes(label=lab,color=grp),data=df1[df1$x>1,],size=5,hjust=1,vjust=1)+
  theme(legend.position="none") +
  scale_fill_discrete(drop = F) +
  scale_colour_discrete(drop = F)

enter image description here

答案 1 :(得分:1)

一种方法是不使用颜色/填充调色板,而是将所有不需要的标签设置为透明:

ggplot(df1, aes(x = x, y = y)) +
  geom_point(aes(fill = grp), size = 4, shape = 21) +
  geom_text(aes(label = lab, color = grp,
                alpha = x > 1),
            size = 5, hjust = 1, vjust = 1) +
  scale_alpha_manual(values = c("TRUE" = 1, "FALSE" = 0)) +
  theme(legend.position = "none")

plot