2
votes

ggplot2: lignes + points avec remplissage blanc dans le tracé et la légende?

Je veux créer un tracé avec le package ggplot2, qui combine des lignes et des points. Les points doivent avoir des couleurs et des formes selon un indicateur de groupe. Une légende doit être créée, qui affiche les couleurs et les formes en fonction du tracé.

Cette partie a bien fonctionné. Cependant, tous les points doivent avoir un remplissage blanc et je ne trouve pas le bon code pour cela.

Une recherche Google suggère d'utiliser fill = "white" code >, mais cela ne fonctionne pas.

Prenons l'exemple de données et de tracé suivants:

library("ggplot2")

# Example data
df <- data.frame(y = 1:100,
                 x = 1:100,
                 group = as.factor(c(rep(1, 33), rep(2, 33), rep(3, 34))))

# Create plot --> fill = "white" doesnt work
ggplot(df, aes(x = x, y = y)) + 
  geom_line(aes(colour = factor(group, labels = c("a", "b", "c")))) +
  geom_point(aes(colour = factor(group, labels = c("a", "b", "c")),
                 shape = factor(group, labels = c("a", "b", "c"))),
             fill = "white") +              ##### This line is not working #####
  theme(legend.title = element_blank())

 entrez la description de l'image ici

Question: Comment pourrais-je remplir les points de ce graphique avec du blanc (à la fois dans le graphique et dans la légende)?


0 commentaires

3 Réponses :


2
votes

Vous pouvez utiliser scale_shape_discrete pour définir solid = FALSE :

ggplot(df, aes(x = x, y = y)) + 
  geom_line(aes(colour = factor(group, labels = c("a", "b", "c")))) +
  scale_shape_discrete(solid = F) +
  geom_point(aes(colour = factor(group, labels = c("a", "b", "c")),
                 shape = factor(group, labels = c("a", "b", "c")))) +              
theme(legend.title = element_blank())

 entrez la description de l'image ici


4 commentaires

Cependant, cela ne définit pas le remplissage: il est supprimé à la place.


Votre réponse n'utilise pas les formes de points 21 à 25 qui ont deux couleurs, la bordure et le remplissage.


Vrai, mais pertinent uniquement lorsque vous souhaitez remplir les points avec une couleur différente du blanc. Comment cela justifie un vote négatif me dépasse, mais moi, mon invité.


Ne pas avoir de remplissage et avoir un remplissage blanc ne sont pas la même chose.



2
votes

Les formes par défaut utilisées par ggplot2 n'ont qu'une couleur: pour obtenir à la fois un couleur et un remplissage, vous devez utiliser des formes de points de 21 à 25. Puis réglage fill = "white" fonctionnera:

library(ggplot2)

df <- data.frame(
  y = 1:10, x = 1:10,
  group = factor(rep(1:3, c(3, 3, 4)), labels = letters[1:3])
)

ggplot(df, aes(x = x, y = y, colour = group)) +
  geom_line() +
  geom_point(aes(shape = group), fill = "white", size = 3) +
  theme(legend.title = element_blank()) +
  scale_shape_manual(values = 20 + seq_along(unique(df$group)))


2 commentaires

À titre d'exemple amusant, essayez de permuter l'ordre de geom_point et geom_line . Maintenant, la ligne est tracée au-dessus des points!


@ Mikko Marttila Merci pour la solution supplémentaire et l'explication! @ MrGumble Merci pour l'indice!



1
votes

Trouver une solution si vous n'utilisez pas de formes standard 21:25. L'astuce consiste à appeler geom_point deux fois, un avec la forme 21 pour nettoyer la ligne qui se chevauche et un autre pour superposer les formes désirées.

library(ggplot2)
library(RColorBrewer)
Paired = brewer.pal(n=10, name="Paired")
unicodeShapes = -10122:-10131

df = data.frame(y = 1:10, x = 1:10, labels = LETTERS[1:10])

ggplot(data=df,aes(x=x, y=y)) +
  geom_line(color="gray50") + 
  geom_point(aes(x=x, y=y), color="white", shape=21, fill="white", size=5.0,show.legend=FALSE) + 
  geom_point(aes(color=labels, shape=labels), size=6.5) + 
  scale_shape_manual(name="Labels",values=unicodeShapes) +
  scale_color_manual(name="Labels",values=Paired) +
  theme_classic()+
  theme(axis.line.x=element_line(color="gray20", size=1.0),
        axis.line.y=element_line(color="gray20", size=0.5),
        panel.grid.major.x=element_blank(),
        panel.grid.minor=element_blank(), 
        panel.border=element_rect(colour="gray50",fill=NA,size=1.0),
        panel.background = element_rect(colour = "gray50", size=1.0),
        legend.position="bottom",
        text=element_text(size=18))

Formes en haut de la ligne


1 commentaires

Merci pour cette solution intéressante avec des étiquettes.