【问题标题】:Resetting the color in each column of ggplot facets重置 ggplot 构面每列中的颜色
【发布时间】:2020-07-14 10:37:12
【问题描述】:

我有一个带有刻面和颜色的 ggplot。颜色与“ID”相关,构面的列与“类型”相关。一个 ID 始终属于同一类型,但每个类型中有不同数量的 ID。我想用每列刻面重置颜色,以使颜色有更大的差异。

ggplot(data = plt_cont_em, aes(x = Jahr, y = Konz)) +
   geom_point(aes(color=factor(ID))) +
   facet_grid(Schadstoff_ID ~ Type, scales = "free_y")

现在看起来像:

我明白,我必须为颜色引入一个虚拟变量。但是有没有一种简单的方法来计算每种类型中的 ID,从每种类型中以 1 开始?


由于数据是机密的,我创建了显示相同问题的虚拟数据。

     ID<-c()
     Type<-c()
     Jahr<-c()
     Schadstoff<-c()
     Monat<-c()
     Konz<-c()
    for (i in 1:25){
        #i = ID
        #t = Type
        t<-sample(c("A","B","C"),1)
        for (j in 1:5){
            #j = Schadstoff
            if(runif(1)<0.75){
                for(k in 2015:2020){
                    #k = Jahr
                    for(l in 1:12){
                        #l = Monat
                        if(runif(1)<0.9){
                             ID<-c( ID,i)
                             Type<-c( Type,t)
                             Jahr<-c( Jahr,k)
                             Schadstoff<-c( Schadstoff,j)
                             Monat<-c( Monat,l)
                             Konz<-c( Konz,runif(1))
                        }
                    }
                }
            }
        }
    }
    tmp<- data.frame(ID,Type, Jahr, Schadstoff, Monat, Konz)

tmp<-tmp %>% group_by( Type) %>% mutate( Color=row_number())

p<-ggplot(data = tmp, aes(x = Jahr, y = Konz)) +
    geom_point(aes(color=factor(Color)), size=0.8) +
    facet_grid(Schadstoff ~ Type, scales = "free") +
    theme_light() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
p

问题仍然存在,分组不起作用并且每行的颜色都是唯一的。

【问题讨论】:

    标签: r ggplot2 dplyr colors facet


    【解决方案1】:

    使用dplyr,您可以在group_by 键入并在每个组内使用IDdense_rank 创建一个新列:

    plt_cont_em %>%
      group_by(Type) %>%
      mutate(Type_ID = dense_rank()) %>%
      ggplot() + 
      ...
    

    这将对组内的每个 ID 从小到大进行“排名”,保持具有相同 ID 的记录具有相同的值。

    您可能会想要排除图例,因为它没有什么意义。

    library(dplyr)
    library(ggplot2)
    
    # Using provided random data
    tmp <- tmp %>% 
      group_by(Type) %>%
      mutate(Color = dense_rank(ID))
    
    ggplot(data = tmp, aes(x = Jahr, y = Konz)) +
      geom_point(aes(color = factor(Color)), size = 0.8) +
      facet_grid(Schadstoff ~ Type, scales = "free") +
      theme_light() + 
      theme(axis.text.x = element_text(angle = 45, hjust = 1))
    

    reprex package (v0.3.0) 于 2020 年 4 月 2 日创建

    【讨论】:

    • 谢谢!不知何故,该组不起作用,现在每行都有一个唯一的 row_number。此外,我想保留图例中的 ID,因为它们稍后将被名称替换。但也许每种类型制作一个图更容易,因为只有 3 种类型。
    • 如果没有您的实际数据,很难知道发生了什么。尝试使用dput(plt_cont_em) 的输出编辑问题
    • 数据是机密的(而且非常庞大),所以我不能在这里发布输出。但我在第一篇文章中添加了一个随机数据生成器。
    • 啊,我明白了,每个 ID 在 Type 中都是重复的。更新我的答案
    猜你喜欢
    • 2023-03-19
    • 2021-10-02
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多