1
votes

Deux échelles de couleurs pour différentes géomes

J'obtiens un comportement étrange en essayant de créer une différence geom_rect dans différentes facettes. Dans l'exemple ci-dessous, la couleur du geom_point doit être la même que celle du remplissage du geom_rect, qui doit être identique au contour du geom_rect. Cependant, les facteurs semblent se concaténer d'une manière étrange quelque part.

Toute aide serait appréciée.

Je ne veux pas que les points soient colorés par séquence, car le cluster et la séquence ne seront pas toujours identiques (c'est pour visualiser une statistique de permutation).

CEUX SONT ÉVIDENTS PAS LES DONNÉES RÉELLES QUE JE VEUX TRACER!

scatter.dt = data.table(sequence = factor(paste('Sequence',c(1,2,3,4))),
                        cluster = sample(factor(paste('Cluster',c(1,2,3,4)), levels = paste('Cluster',c(1,2,3,4)))),
                        outcome = c(1,1,1,1),
                        transition.time = 1:4,
                        intervention.time = 1:4)
vline.dt = data.table(sequence = scatter.dt$sequence,
                      cluster = scatter.dt$cluster,
                      transition.time = 1:4,
                      intervention.time = 2:5)

Doit également avoir des couleurs de cluster dans le même ordre que les couleurs de séquence lorsque les données sont générées ainsi:

library(data.table)
library(ggplot2)

scatter.dt = data.table(sequence = factor(paste('Sequence',c(1,2,3,4))),
                        cluster = factor(paste('Cluster',c(1,2,3,4))),
                        outcome = c(1,1,1,1),
                        transition.time = 1:4,
                        intervention.time = 1:4)
vline.dt = data.table(sequence = scatter.dt$sequence,
                      cluster = scatter.dt$cluster,
                      transition.time = 1:4,
                      intervention.time = 2:5)

plot1 = ggplot2::ggplot() +
  ggplot2::geom_rect(data = vline.dt,
                     aes(fill = sequence,
                         colour = sequence,
                         xmin = transition.time, 
                         xmax = intervention.time, 
                         ymin = -Inf, 
                         ymax = Inf),
                     alpha = .6,
                     size = 2) +
  ggplot2::geom_point(data=scatter.dt,
                      aes(x=transition.time ,
                          y=intervention.time,
                          colour = cluster),
                      alpha=1,
                      size = 4) +
  ggplot2::facet_grid(sequence + cluster ~ .)

plot(plot1)

 entrez la description de l'image ici


3 commentaires

dans l'appel geom_point , le paramètre de couleur doit être défini sur sequence.


Désolé, je pensais qu'il était assez clair qu'il s'agissait d'un exemple de jouet, la version la plus simple de mon problème, car ces données elles-mêmes sont assez inutiles!


Comme dans ma précédente édition je ne veux pas que les points soient colorés par séquence, car le cluster et la séquence ne seront pas toujours identiques (c'est pour visualiser une statistique de permutation).


3 Réponses :


2
votes

Définissez le paramètre de couleur dans l'appel geom_point à la séquence. De cette façon, vous obtenez

library(data.table)
library(ggplot2)

scatter.dt = data.table(sequence = factor(paste('Sequence',c(1,2,3,4))),
                        cluster = factor(paste('Cluster',c(1,2,3,4))),
                        outcome = c(1,1,1,1),
                        transition.time = 1:4,
                        intervention.time = 1:4)
vline.dt = data.table(sequence = scatter.dt$sequence,
                      cluster = scatter.dt$cluster,
                      transition.time = 1:4,
                      intervention.time = 2:5)

plot1 = ggplot2::ggplot() +
  ggplot2::geom_rect(data = vline.dt,
                     aes(fill = sequence,
                         colour = sequence,
                         xmin = transition.time, 
                         xmax = intervention.time, 
                         ymin = -Inf, 
                         ymax = Inf),
                     alpha = .6,
                     size = 2) +
  ggplot2::geom_point(data=scatter.dt,
                      aes(x=transition.time ,
                          y=intervention.time,
                          colour = sequence),
                      alpha=1,
                      size = 4) +
  ggplot2::facet_grid(sequence + cluster ~ .)

plot(plot1)

 entrez la description de l'image ici


2 commentaires

Merci, mais je ne veux pas que les points soient colorés par séquence, car le cluster et la séquence ne seront pas toujours identiques (c'est pour visualiser une statistique de permutation).


Bonne réponse à cette question - le PO n'a pas précisé son point de vue.



0
votes

Vous mélangez plusieurs échelles de couleurs. Créer plus d'une échelle pour une esthétique n'est pas facilement possible sans quelques piratages. Ou forfait supplémentaire. Une option consiste à utiliser ggnewscale . Cependant, je pense personnellement que les parcelles avec le moins d'échelles / dimensions / couleurs possibles sont les meilleures pour une visualisation efficace.

La solution la plus simple est simplement de supprimer la couleur de votre rect - ainsi vous ne laisserez l'échelle de couleurs qu'à vos points sans perdre aucune information et rendant le tracé plus efficace (moins compliqué).

(Veuillez noter que j'ai supprimé le chargement inutile de data.table et le ggplot :: dont vous n'avez pas nécessairement besoin lors du chargement complet de ggplot2.

Il est important de définir réellement votre échelle sur des valeurs différentes, sinon ggplot utilisera exactement les mêmes valeurs pour vos échelles de remplissage et de couleur. Remarque J'ai utilisé des échelles de brassage, elles sont généralement compatibles avec les daltoniens. colorbrewer2.org

Comme ceci:

library(ggplot2)

scatter.dt <- data.frame(sequence = factor(paste("Sequence", c(1, 2, 3, 4))), cluster = factor(paste("Cluster", c(1, 2, 3, 4))), outcome = c(1, 1, 1, 1), transition.time = 1:4, intervention.time = 1:4)
vline.dt <- data.frame(sequence = scatter.dt$sequence, cluster = scatter.dt$cluster, transition.time = 1:4, intervention.time = 2:5)

ggplot() +
  geom_rect(data = vline.dt,
            aes(fill = sequence,
                xmin = transition.time, 
                xmax = intervention.time, 
                ymin = -Inf, 
                ymax = Inf),
            alpha = .6) +
  geom_point(data=scatter.dt,
             aes(x=transition.time ,
                 y=intervention.time,
                 colour = cluster),
             size = 4) +
  scale_color_brewer(palette = 'Dark2')+
  scale_fill_brewer(palette = 'Blues') +
  facet_grid(sequence + cluster ~ .)

Créé le 2019-12 -02 par le package reprex (v0.3.0)


1 commentaires

Merci ggnewscale est ce que je veux.



1
votes

Utilisation de ggnewscale:

scatter.dt = data.table(sequence = factor(paste('Sequence',c(1,2,3,4))),
                        cluster = sample(factor(paste('Cluster',c(1,2,3,4)), levels = paste('Cluster',c(1,2,3,4)))),
                        outcome = c(1,1,1,1),
                        transition.time = 1:4,
                        intervention.time = 1:4)
vline.dt = data.table(sequence = scatter.dt$sequence,
                      cluster = scatter.dt$cluster,
                      transition.time = 1:4,
                      intervention.time = 2:5)

 entrez la description de l'image ici

Avec les données générées: p >

library(data.table)
library(ggplot2)
library(ggnewscale)

scatter.dt = data.table(sequence = factor(paste('Sequence',c(1,2,3,4))),
                        cluster = factor(paste('Cluster',c(1,2,3,4))),
                        outcome = c(1,1,1,1),
                        transition.time = 1:4,
                        intervention.time = 1:4)
vline.dt = data.table(sequence = scatter.dt$sequence,
                      cluster = scatter.dt$cluster,
                      transition.time = 1:4,
                      intervention.time = 2:5)

plot1 = ggplot2::ggplot() +
  ggplot2::geom_rect(data = vline.dt,
                     aes(fill = sequence,
                         colour = sequence,
                         xmin = transition.time, 
                         xmax = intervention.time, 
                         ymin = -Inf, 
                         ymax = Inf),
                     alpha = .6,
                     size = 2) +
  ggnewscale::new_scale_color() +
  ggplot2::geom_point(data=scatter.dt,
                      aes(x=transition.time ,
                          y=intervention.time,
                          colour = cluster),
                      alpha=1,
                      size = 4) +
  ggplot2::facet_grid(sequence + cluster ~ .)

plot(plot1)

 entrez la description de l'image ici


0 commentaires