2017-09-23 2 views
1

J'ai créé un graphique à barres dans ggplot et ajouté quelques lignes. Ce qui se passe est que la couleur et la description des lignes ne correspondent pas:Légende geom_hline pas dans le bon ordre

enter image description here

La ligne jaune doit avoir la description « membre médian », mais est affiché comme «membre Avg. Que se passe t-il ici? Le code I utilisé:

library(ggplot2) 
library(dplyr) 

MemberID=c(1,1,1, 2, 2, 2) 
ClientCode = c(10,100,1000, 20, 200, 2000) 
Duration = c(2356, 1560, 9000, 4569, 3123, 8000) 


df <- data.frame(MemberID, ClientCode, Duration) 

dr <- df %>% 
    filter(MemberID == 1) 

dr_avg <- df 

ggplot(dr, aes(reorder(as.character(ClientCode), -Duration), Duration, fill=-Duration)) + 
    geom_bar(stat="identity") + # the height of the bar will represent the value in a column of the data frame 
    xlab('ClientCode') + 
    ylab('Duration (Minutes)') + 
    geom_hline(data=dr, aes(yintercept=mean(Duration), linetype = 'Avg Member'), color = 'red', show.legend = TRUE) + 
    geom_hline(data=dr, aes(yintercept=median(Duration), linetype = 'Median Member'), color = 'orange', show.legend = TRUE) + 
    geom_hline(data=dr_avg, aes(yintercept=mean(Duration), linetype = 'Avg all data'), color = 'blue', show.legend = TRUE) + 
    scale_linetype_manual(name = "Line", values = c(2, 2, 2), guide = guide_legend(override.aes = list(color = c("red", "orange", "blue")))) +coord_flip() 
+0

Salut Alfred, vous pouvez publier cette question sur le site de la communauté rstudio: https://community.rstudio.com avec un reprex pour mieux aider les autres à voir le problème que vous rencontrez. – petergensler

+0

Merci, je ne savais pas à propos de cette communauté. – Alfred

Répondre

0

Ne créez pas geom_hline pour chaque ligne que vous souhaitez insérer. Que faire si vous en avez des centaines? Créez un objet séparé d et spécifiez-y différents types de ligne et couleurs geom_hline(data = d, aes(yintercept = value, linetype = name, color = name)). Lorsque vous souhaitez spécifier les couleurs, utilisez: scale_colour_manual(values = c("red", "orange", "blue")).

d1 <- summarize(df, mean(Duration), median(Duration)) 
d2 <- summarize(dr_avg, mean(Duration)) 
d <- data.frame(value = as.numeric(c(d1, d2)), 
       name = c('Avg Member', 'Median Member', 'Avg all data')) 

ggplot(dr, aes(reorder(as.character(ClientCode), -Duration), 
       Duration, 
       fill = factor(-Duration))) + 
    geom_bar(stat = "identity") + 
    labs(x = "ClientCode", 
     y = "Duration (Minutes)") + 
    geom_hline(data = d, aes(yintercept = value, linetype = name, color = name)) + 
    scale_fill_brewer(palette = "Dark2") + 
    scale_colour_manual(values = c("red", "orange", "blue")) + 
    coord_flip() + 
    theme_bw() 

enter image description here

PS .: Les données que vous avez fourni n'a pas de sens que deux lignes se chevauchent.

+0

Merci, ça marche! De cette façon, le code est également plus soigné. Lorsque vous utilisez dr au lieu de df pour d1, trois lignes apparaissent. Dr = filtré et prend 3 lignes au lieu de toutes les lignes. – Alfred