Сброс цвета в каждом столбце фасетов ggplot - PullRequest
4 голосов
/ 02 апреля 2020

У меня есть ggplot с фасетами и цветами. Цвета связаны с «ID», а столбцы фасетов связаны с «Type». Один идентификатор всегда относится к одному и тому же типу, но в каждом типе есть разные номера идентификаторов. Я хотел бы сбросить цвета для каждого столбца граней, чтобы получить большую разницу в цветах.

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

Теперь это выглядит следующим образом: ggplot now

Я понимаю, что мне нужно ввести фиктивную переменную для цвета. Но есть ли простой способ нумерации идентификаторов в каждом типе, начиная с каждого типа с 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

Проблема по-прежнему существует, группировка не работает и цвет уникален для каждой строки.

1 Ответ

1 голос
/ 02 апреля 2020

Используя dplyr, вы можете group_by Набрать и создать новый столбец с dense_rank из ID внутри каждой группы:

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

Это будет «ранжировать» каждый идентификатор от наименьшего наибольший внутри группы, ведение записей с одним и тем же идентификатором с тем же значением.

Вероятно, затем вы захотите исключить легенду, так как это будет мало смысла.

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))

Создано в 2020-04-02 пакетом Представить (v0.3.0)

...