web-dev-qa-db-fra.com

Modifier les couleurs de barres particulières dans un graphique à barres

J'ai créé des graphiques à barres et je me demandais s'il était possible de colorer les barres sur un graphique selon qu'elles se situaient au-dessus ou en dessous de l'axe des x?

Pour plus de précision, voici le type de graphique à barres que je veux dire:

enter image description here

Idéalement, j'aimerais pouvoir colorer les barres au-dessus d'une couleur distincte à celles ci-dessous afin que le graphique soit plus attrayant, j'ai cherché mais je ne trouve aucune méthode pour le faire, quelqu'un peut-il m'aider?

Merci d'avance. :)

18
George Burrows

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 des valeurs, vous pouvez utiliser une stratégie similaire (en utilisant findInterval() à la place du test logique simple):

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

32
Josh O'Brien

Une solution ggplot2 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 vient de la valeur par défaut position = 'stack'.

17
mnel

Une façon consiste à indexer un vecteur de couleurs avec une variable logique ou facteur (c'est un idiome courant 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 ici est 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 contraignons en numérique dans l'appel barplot():

> 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 S et de 2 S sélectionne des éléments dans le vecteur de couleur cols, tels 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 défini la bordure des barres sur la couleur appropriée, via l'argument border.

L'intrigue résultante devrait ressembler à ceci

enter image description here

13
Gavin Simpson

J'ai trouvé cette page en cherchant de l'aide pour colorer des barres individuelles dans un graphique à barres en fonction d'un facteur. Je n'ai pu trouver aucune autre source d'information mais grâce à cette page, j'ai trouvé ceci:

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

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

barplot (x, col = cols)

1
AJGL