2017-09-22 2 views
1

Je dois définir manuellement les couleurs de chaque groupe dans un graphique à barres. J'ai actuellement le remplissage = temps et cela détermine actuellement les couleurs. Nous avons 5 marques et les valeurs pour 2 mois distincts par marque. J'ai besoin de grouper par marque mais j'ai aussi besoin d'un moyen d'afficher quelle barre représente quel mois (temps), je peux le faire actuellement mais je veux colorier chaque groupe de barres. par exemple. barres marque1 = barres rouges, marque2 = bleu ect tout en ayant fill = tempsDéfinir manuellement les couleurs par groupe dans le graphique barplot ggplot

Voici mon code:

colors <- c("#98999B", "#F4C400", "#CB003D", "#6BABE5", "#E65400", "#542C82") 

time <- c("February 2017","March 2017","February 2017","March 2017","February 2017","March 2017","February 2017","March 2017","February 2017","March 2017") 
value <- as.numeric(c("3.08","3.64","1.61","1.81","-1.02","-1.09","-5.23","-5.08","-1.51","-1.43")) 
brand <- c("brand1","brand1","brand2","brand2","brand3","brand3","brand4","brand4","brand5","brand5") 

Monthly_BMS_df <- as.data.table(cbind(time,value,brand)) 

bar <- ggplot(Monthly_BMS_df, aes(brand, value, fill = time)) + 
    geom_bar(stat="identity", position = "dodge") + 
theme(legend.position='none') + scale_fill_manual(values=colors) 

ggplotly(bar, width=1000,height=350) 

Répondre

2

Une option serait de créer une palette de couleurs hcl avec une teinte différente pour chaque brand et une luminosité séquentielle identique pour chaque mois sur différentes marques. Par exemple:

library(ggplot2) 
library(data.table) 
library(plotly) 

Monthly_BMS_df <- data.table(time, value, brand) 

Créer palette de couleurs:

nb = length(unique(Monthly_BMS_df$brand)) 
nm = length(unique(Monthly_BMS_df$time)) 

colors = apply(expand.grid(seq(70,40,length=nm), 100, seq(15,375,length=nb+1)[1:nb]), 1, 
       function(x) hcl(x[3],x[2],x[1])) 

Dans le code ci-dessous, nous utilisons fill=interaction(time, brand) pour mapper une couleur différente pour chaque combinaison de marque et mois. Ensuite, scale_fill_manual affecte la palette de couleurs que nous avons créée ci-dessus. La luminosité diminue pour chaque mois, de sorte que mars est plus sombre que février.

bar <- ggplot(Monthly_BMS_df, aes(brand, value, fill=interaction(time, brand))) + 
    geom_hline(yintercept=0, colour="grey60") + 
    geom_bar(stat="identity", position = "dodge", show.legend=FALSE) + 
    scale_fill_manual(values=colors) + 
    theme_classic() 

ggplotly(bar, width=1000, height=350) 

enter image description here

Comme alternative au tracé ci-dessus, une parcelle de ligne pourrait le rendre plus facile de comparer les tendances de chaque marque.

library(dplyr) 

ggplot(Monthly_BMS_df, aes(time, value, group=brand, colour=brand)) + 
    geom_hline(yintercept=0, colour="grey60") + 
    geom_text(data=Monthly_BMS_df %>% filter(time==min(time)), 
      aes(label=brand), position=position_nudge(-0.25)) + 
    geom_line(linetype="12", alpha=0.5, size=0.7) + 
    geom_text(aes(label=value)) + 
    guides(colour=FALSE) + 
    theme_classic() 

enter image description here