Изменение цвета конкретных полос на гистограмме

Я создаю несколько бар-диаграмм, и мне было интересно, можно ли покрасить полосы на диаграмме в зависимости от того, лежат ли они выше или ниже оси x?

Для пояснения это тип бар-диаграммы, который я имею в виду:

enter image description here

В идеале я хотел бы иметь возможность окраски баров выше отдельного цвета ниже, чтобы график выглядел более привлекательным, я искал, но я не могу найти способ сделать это, может ли кто-нибудь помочь?

Спасибо заранее.:)

Ответы

Ответ 1

Здесь одна стратегия:

## 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)

Если вам нужно больше двух цветов, основанных на значении, вы можете использовать аналогичную стратегию (используя findInterval() вместо простого логического теста):

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

Ответ 2

A ggplot2 с использованием geom_bar с 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') удаляет легенду, position = 'dodge' останавливает предупреждение, которое появляется по умолчанию position = 'stack'.

Ответ 3

Один из способов - проиндексировать вектор цветов с логической или факторной переменной (это обычная идиома в R.

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

Трюк здесь 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

который мы вызываем в числовом вызове 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

Вектор 1 и 2 выбирает элементы из вектора цвета cols, такие, что:

> 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"

который является цветом, переданным на каждый нанесенный штрих.

В приведенном выше коде я также установил границу баров на соответствующий цвет, используя аргумент border.

Получившийся сюжет должен выглядеть так:

enter image description here

Ответ 4

Я нашел эту страницу при поиске справки о том, как окрасить отдельные столбцы в гистограмме в зависимости от фактора. Я не мог найти другого источника информации, но благодаря этой странице придумал следующее:

cols < - ifelse (df $Страна == "Гренландия", "зеленый", "синий" )

Затем он переходит в barplot обычным способом, как описано выше:

barplot (x, col = cols)