2016-09-23 1 views
0

Je souhaite créer un graphique à barres empilées dans lequel mes axis.text prennent leurs valeurs de couleur à partir d'une variable de la trame de données qui fournit également la couleur fill de la barre. Ceci est très important parce que les consommateurs des visuels finaux verront une série de ces diagrammes à barres ainsi je dois m'assurer que les couleurs sont conformées pour chaque type de produit quoique les valeurs de montant (et donc la commande) varieront. Le ci-dessous est le plus proche que je peux obtenir.Correspondance des étiquettes axis.text aux couleurs contenues dans la variable de trame de données dans ggplot

# My data sample 
df <- data.frame(x=1:4, Type = c("Metals", "Foodstuff", "Textiles", "Machinery"), myColour = c('blue', 'red', 'green', 'orange'), Amount = c(75, 50, 25, 5)) 

# Create factor to order by amount value 
df$Type <- factor(df$Type, levels = df[order(df$Amount), "Type"]) 

# MAKE BAR 
gg1 <- ggplot(df, aes(Type, Amount, fill = Type, color = myColour)) + 
    geom_bar(stat = 'identity', position = 'dodge', show.legend = FALSE, width = .85, colour = 'lightgrey', fill = df$myColour) + 
    #ggtitle("Exports Profile (%)") + 
    labs(x = NULL, y = NULL) + 
    scale_y_continuous(breaks = waiver(), limits = c(0,100)) + 
    theme(#plot.title = element_text(family= 'sans', color = 'black', size = 28), 
    #axis.title = element_text(family= 'sans', color = 'black', size = 24), 
    axis.text.y = element_text(colour = df$myColour, size = 18, face = 'bold'), 
    axis.ticks.y = element_blank(), 
    axis.text.x = element_text(colour = 'black', size = 16), 
    axis.ticks.x = element_line(colour = 'grey60'), 
    axis.ticks.length = unit(3, "mm"), 
    axis.line = element_line(NULL), 
    plot.background = element_rect(fill = NULL), 
    panel.background = element_rect(fill = 'white', colour = 'white'), 
    panel.grid.major.x = element_line(colour = 'grey60', linetype = 'dashed'), 
    panel.grid.major.y = element_line(colour = 'grey60', linetype = 'dashed'), 
    #panel.margin = unit(c(0,0,0,0), "mm"), 
    aspect.ratio = (600/450)) + 
    coord_flip() 
gg1 

qui produit: enter image description here

Répondre

1

Votre taux de facteur ne sont pas mapping avec les modifications apportées à votre commande de facteur.

Notez que j'ai fait un changement à votre df afin qu'il change en effet lorsqu'il est réorganisé, le changement était dans la colonne Amount.

df <- data.frame(x=1:4, Type = c("Metals", "Foodstuff", "Textiles", "Machinery"), myColour = c('blue', 'red', 'green', 'orange'), Amount = c(50, 75, 25, 5))

vous une tidyverse de faveur et la charge.
library(tidyverse)

Ensuite, utilisez themeset
theme_set(theme_classic()+ theme(panel.grid.major.x = element_line(colour = 'grey60', linetype = 'dashed'), panel.grid.major.y = element_line(colour = 'grey60', linetype = 'dashed'), axis.ticks.y = element_blank(), axis.text.x = element_text(colour = 'black', size = 16), axis.ticks.x = element_line(colour = 'grey60'), axis.ticks.length = unit(3, "mm"), aspect.ratio = (600/450), axis.title.x=element_blank(), axis.title.y=element_blank()))

Vous pouvez alors 'pirater' et relevel les facteurs (peut-être pas la meilleure méthode, mais obtient fait).

df %>% arrange(Amount) %>% mutate(myColour = factor(myColour, myColour), Type = factor(Type, Type)) -> df1

Il est alors plus facile de tirer les niveaux de couleur comme vecteur de traçage.

mycols <- as.vector(levels(df1$myColour))

puis tracer

ggplot(df1, aes(Type, Amount, color = myColour, fill = myColour)) + geom_bar(stat = 'identity', position = 'dodge', show.legend = FALSE, width = .85)+ theme(axis.text.y = element_text(colour = mycols, size = 18, face = 'bold'))+ coord_flip()+ scale_fill_manual(values = mycols)+ scale_color_manual(values = mycols)

Espérons qui fonctionne pour vous.

Ceci est l'édition originale qui n'a pas fonctionné donc peut être ignorer: Changer le df$myColour en myColour dans deux instances dans votre code.

Avec autant de réglages, vous devriez vraiment penser à utiliser theme_set.

+0

En faisant vos suggestions de modifications, je reçois ceci: Erreur dans la couche (données = données, mappage = mappage, stat = stat, geom = GeomBar,: objet 'myColour' pas trouvé – mikeLdub

+0

C'est ça ... et j'ai didn Je ne sais même pas sur tidyverse ... gracias! – mikeLdub