更改条形图中特定条形的颜色

时间:2012-10-28 20:59:43

标签: r colors bar-chart

我一直在创建一些条形图,我想知道是否可以在图表上显示颜色条,具体取决于它们位于x轴的上方还是下方?

为了澄清,这是我所说的条形图类型:

enter image description here

理想情况下,我希望能够将单独颜色上方的条形颜色设置为下方,以便图形看起来更具吸引力,我一直在搜索,但我找不到任何方法来做到这一点,任何人都可以帮忙吗? / p>

提前致谢。 :)

4 个答案:

答案 0 :(得分:32)

这是一个策略:

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

答案 1 :(得分:17)

使用ggplot2geom_bar的{​​{1}}解决方案。

stat_identity

enter image description here

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') 删除图例,scale_fill_discrete(guide = 'none')停止来自默认position = 'dodge'的警告。

答案 2 :(得分:13)

一种方法是使用逻辑或因子变量索引颜色矢量(这是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 s和2 s的向量从颜色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

答案 3 :(得分:1)

我在寻找有关如何根据因素为条形图中的单个条形图着色的帮助时找到了此页面。我无法找到任何其他信息来源,但多亏了这个页面,提出了这个:

cols&lt; - ifelse(df $ Country ==&#34; Greenland&#34;,&#34; green&#34;,&#34; blue&#34;)

然后如上所述以通常的方式传递到条形图中:

barplot(x,col = cols)