代码之家  ›  专栏  ›  技术社区  ›  Vasily A

对数据子集的“color”和“fill”强制使用相同的调色板

  •  0
  • Vasily A  · 技术社区  · 5 年前

    具有以下示例数据集:

    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=grp 两者的美学 geom_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 回复  |  直到 5 年前
        1
  •  1
  •   Maurits Evers    5 年前

    这个问题来自文本和填充颜色的不同因素级别。我们可以通过使用 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

        2
  •  1
  •   Z.Lin    5 年前

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

    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