19 votes

Modifier les couleurs de certaines barres d'un diagramme à barres

J'ai créé des diagrammes à barres et je me demandais s'il était possible de colorer les barres d'un diagramme selon qu'elles se situent au-dessus ou au-dessous de l'axe des x ?

Pour plus de clarté, voici le type de diagramme à barres dont je parle :

enter image description here

Idéalement, j'aimerais pouvoir colorer les barres du haut d'une couleur différente de celles du bas afin que le graphique soit plus attrayant. J'ai eu beau chercher, je n'ai trouvé aucune méthode pour y parvenir.

Merci d'avance :)

34voto

Josh O'Brien Points 68397

Voici une stratégie :

## Create a reproducible example
set.seed(5)
x <- cumsum(rnorm(50))

## Create a vector of colors selected based on whether x is <0 or >0  
## (FALSE + 1 -> 1 -> "blue";    TRUE + 1 -> 2 -> "red")
cols <- c("blue", "red")[(x > 0) + 1]  

## Pass the colors in to barplot()   
barplot(x, col = cols)

Si vous voulez plus de deux couleurs basées sur la valeur, vous pouvez employer une stratégie similaire (en utilisant la fonction findInterval() au lieu du simple test logique) :

vals <- -4:4
breaks <- c(-Inf, -2, 2, Inf)
c("blue", "grey", "red")[findInterval(vals, vec=breaks)]
# [1] "blue" "blue" "grey" "grey" "grey" "grey" "red"  "red"  "red" 

enter image description here

20voto

mnel Points 48160

A ggplot2 solution en utilisant geom_bar avec stat_identity .

library(ggplot2)
ggplot(dat, aes(x= seq_along(x), y = x)) + 
  geom_bar(stat = 'identity', aes(fill = x>0), position = 'dodge', col = 'transparent') + 
  theme_bw() + scale_fill_discrete(guide = 'none') + 
  labs(x = '', y = 'NAO Index')

enter image description here

scale_fill_discrete(guide = 'none') supprime la légende, position = 'dodge' arrête l'avertissement qui provient de l'option par défaut position = 'stack' .

15voto

Gavin Simpson Points 72349

Une façon de procéder consiste à indexer un vecteur de couleurs à l'aide d'une variable logique ou factorielle (il s'agit d'une pratique courante dans R.).

set.seed(1)
NAO <- rnorm(40)
cols <- c("red","black")
pos <- NAO >= 0
barplot(NAO, col = cols[pos + 1], border = cols[pos + 1])

L'astuce consiste à pos :

> pos
 [1] FALSE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE
[11]  TRUE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE  TRUE  TRUE
[21]  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE
[31]  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE

que nous transformons en valeur numérique dans le barplot() appel :

> pos + 1
 [1] 1 2 1 2 2 1 2 2 2 1 2 2 1 1 2 1 1 2 2 2 2 2 2 1 2 1 1 1 1 2
[31] 2 1 2 1 1 1 1 1 2 2

Le vecteur de 1 et 2 s sélectionne des éléments du vecteur de couleur cols , tel que :

> cols[pos + 1]
 [1] "red"   "black" "red"   "black" "black" "red"   "black"
 [8] "black" "black" "red"   "black" "black" "red"   "red"  
[15] "black" "red"   "red"   "black" "black" "black" "black"
[22] "black" "black" "red"   "black" "red"   "red"   "red"  
[29] "red"   "black" "black" "red"   "black" "red"   "red"  
[36] "red"   "red"   "red"   "black" "black"

qui est la couleur transmise à chaque barre dessinée.

Dans le code ci-dessus, j'ai également fixé la bordure des barres à la couleur appropriée, via l'argument border .

Le tracé obtenu devrait ressembler à ceci

enter image description here

3voto

AJGL Points 53

J'ai trouvé cette page alors que je cherchais de l'aide sur la manière de colorer des barres individuelles dans un diagramme à barres en fonction d'un facteur. Je n'ai pas trouvé d'autre source d'information, mais grâce à cette page, j'ai trouvé ceci :

cols <- ifelse(df$Country == "Greenland", "green", "blue")

Il est ensuite passé dans barplot de la manière habituelle décrite ci-dessus :

barplot(x, col = cols)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X