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)
3 Réponses :
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)
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.
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)
Merci ggnewscale
est ce que je veux.
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)
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)
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).