web-dev-qa-db-fra.com

Deux geom_points ajoutent une légende

Je trace un graphique à 2 geom_points avec le code suivant:

source("http://www.openintro.org/stat/data/arbuthnot.R")
library(ggplot2)
ggplot() +
  geom_point(aes(x = year,y = boys),data=arbuthnot,colour = '#3399ff') +
  geom_point(aes(x = year,y = girls),data=arbuthnot,shape = 17,colour = '#ff00ff') +
  xlab(label = 'Year') +
  ylab(label = 'Rate')

Je veux simplement savoir comment ajouter une légende sur le côté droit. Avec la même forme et la même couleur. Le triangle rose devrait avoir la légende "femme" et le cercle bleu la légende "hommes". Semble assez simple, mais après de nombreux essais, je n'ai pas pu le faire. (Je suis débutant avec ggplot).

enter image description here

14
S12000

Si vous renommez vos colonnes du bloc de données d'origine, puis le fusionnez dans un format long avecreshape2::melt, c'est beaucoup plus facile à gérer dans ggplot2. En spécifiant l'esthétique color et shape dans la commande ggplot, et en spécifiant manuellement les échelles des couleurs et des formes, la légende apparaîtra.

source("http://www.openintro.org/stat/data/arbuthnot.R")
library(ggplot2)
library(reshape2)

names(arbuthnot) <- c("Year", "Men", "Women")

arbuthnot.melt <- melt(arbuthnot, id.vars = 'Year', variable.name = 'Sex', 
    value.name = 'Rate')

ggplot(arbuthnot.melt, aes(x = Year, y = Rate, shape = Sex, color = Sex))+
geom_point() + scale_color_manual(values = c("Women" = '#ff00ff','Men' = '#3399ff')) + 
scale_shape_manual(values = c('Women' = 17, 'Men' = 16))

enter image description here

16
Jim M.

Voici une façon de faire cela sans utiliser reshape :: melt. reshape :: melt fonctionne, mais vous pouvez entrer dans une liaison si vous souhaitez ajouter d'autres éléments au graphique, tels que des segments de ligne. Le code ci-dessous utilise l'organisation d'origine des données. La clé pour modifier la légende est de s'assurer que les arguments de scale_color_manual (...) et scale_shape_manual (...) sont identiques sinon vous obtiendrez deux légendes.

source("http://www.openintro.org/stat/data/arbuthnot.R")
library(ggplot2)
library(reshape2)



ptheme <- theme (
  axis.text            = element_text(size = 9),              # tick labels
  axis.title           = element_text(size = 9),              # axis labels
  axis.ticks           = element_line(colour = "grey70", size = 0.25),
  panel.background     = element_rect(fill = "white", colour = NA),
  panel.border         = element_rect(fill = NA, colour = "grey70", size = 0.25),
  panel.grid.major     = element_line(colour = "grey85", size = 0.25),
  panel.grid.minor     = element_line(colour = "grey93", size = 0.125),
  panel.margin         = unit(0 , "lines"),
  legend.justification = c(1, 0), 
  legend.position      = c(1, 0.1),
  legend.text          = element_text(size = 8),
  plot.margin          = unit(c(0.1, 0.1, 0.1, 0.01), "npc")   # c(bottom, left, top, right), values can be negative
)

cols    <- c( "c1" = "#ff00ff", "c2" = "#3399ff" )
shapes  <- c("s1" = 16, "s2" = 17)

p1 <- ggplot(data = arbuthnot, aes(x = year))
p1 <- p1 + geom_point(aes( y = boys,  color = "c1", shape = "s1"))
p1 <- p1 + geom_point(aes( y = girls, color = "c2", shape = "s2")) 
p1 <- p1 + labs( x = "Year", y = "Rate" )
p1 <- p1 + scale_color_manual(name = "Sex", 
                                breaks = c("c1", "c2"), 
                                values = cols,
                                labels = c("boys", "girls"))
p1 <- p1 + scale_shape_manual(name = "Sex", 
                              breaks = c("s1", "s2"),
                              values = shapes,
                              labels = c("boys", "girls"))
p1 <- p1 +  ptheme

print(p1)

résultats de sortie

8
Ken Junk

Voici une réponse basée sur le package tidyverse. Où l'on peut utiliser le tuyau, %>%, Pour enchaîner des fonctions. La création du tracé d'une manière continue, en omettant la nécessité de créer temporairement des variables. Plus d'informations sur le tuyau peuvent être trouvées dans cet article Que signifie la fonction%>% dans R?

Pour autant que je sache, les légendes de ggplot2 ne sont basées que sur des variables esthétiques. Donc, pour ajouter une légende discrète, on utilise une colonne de catégorie et changez l'esthétique en fonction de la catégorie. Dans ggplot, cela se fait par exemple par aes(color=category).

Donc, pour ajouter deux (ou plus) variables différentes d'un bloc de données aux légendes, il faut transformer le bloc de données de telle sorte que nous ayons une colonne de catégorie nous indiquant quelle colonne (variable) est tracée, et une deuxième colonne qui contient réellement la valeur. La fonction tidyr::gather, Qui a également été chargée par tidyverse, fait exactement cela.

Ensuite, on crée la légende en spécifiant simplement quelles variables esthétiques doivent être différentes. Dans cet exemple, le code ressemblerait à ceci:

source("http://www.openintro.org/stat/data/arbuthnot.R")
library(tidyverse)

arbuthnot %>%
    rename(Year=year,Men=boys,Women=girls) %>%
    gather(Men,Women,key = "Sex",value = "Rate") %>%
    ggplot() +
    geom_point(aes(x = Year, y=Rate, color=Sex, shape=Sex)) +
    scale_color_manual(values = c("Men" = "#3399ff","Women"= "#ff00ff")) +
    scale_shape_manual(values = c("Men" = 16, "Women" =  17))

Notez que le package tidyverse se charge également automatiquement dans le package ggplot2. Un aperçu des packages installés peut être trouvé sur leur site Web tidyverse.org .

Dans le code ci-dessus, j'ai également utilisé la fonction dplyr::rename (Également chargée par tidyverse) pour renommer d'abord les colonnes en étiquettes souhaitées. Puisque la légende prend automatiquement les étiquettes égales aux noms des catégories.

Il existe une deuxième façon de renommer les étiquettes de légende, qui consiste à spécifier explicitement les étiquettes dans les fonctions scale_aesthetic_manual Par l'argument labels =. Pour des exemples, voir livre de recettes de légendes . Mais n'est pas recommandé car il devient rapidement désordonné avec plus de variables.

0
Escalen