Изменение цвета конкретных полос на гистограмме
Я создаю несколько бар-диаграмм, и мне было интересно, можно ли покрасить полосы на диаграмме в зависимости от того, лежат ли они выше или ниже оси 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)