如何将ggplot直方图x轴间隔映射到固定调色板?

时间:2014-01-22 12:30:36

标签: r colors ggplot2 histogram

我正在尝试将我的ggplot2直方图分层为固定的间隔,并根据特定的调色板为它们着色:'x<4':black; '4<x<6':blue; '6<x<8':yellow;等等...

我尝试了两种方式,但都没有用。

参考下面的代码,当NoOfElement落到一个小数字(例如500)时,替代方案1失败,并且第一个间隔'x<4'中没有元素。 ggplot2然后将'black'分配给第一个间隔中的任何一个(当size = 500时,这将是'4<x<6')。但这不是我想要的(见图)。

enter image description here

在备选方案2中,我在数据框中创建了另一个变量,并为每个元素分配了颜色。我是基于对Set specific fill colors in ggplot2 by sign中给出的解决方案的修改而做到的。不幸的是,生成的直方图具有由ggplot2随机分配的颜色。

我很困惑,真的很感激一些帮助。提前谢谢!

示例代码:

library(ggplot2)

NoOfElement <- 5000; MyBreaks <- c(-Inf, seq(4, 16, by=2), Inf)
MyColours <- c("black", "blue", "yellow", "green", "gray", "brown", "purple", "red")

set.seed(2)
c <- data.frame(a=rnorm(NoOfElement, 10, 2), b=rep(NA, NoOfElement))
c$b <- cut(c$a, MyBreaks)

try <- 1  # Allows toggling of alternatives below
if (try==1)
{
  p <- ggplot( c, aes(x=c$a, fill=c$b) ) + geom_histogram( binwidth=0.2 ) + 
    scale_fill_manual(breaks = levels(c$b), values = MyColours, 
                      name = "X Intervals") + 
    scale_x_continuous( limits=c(2, 20))
}else
{
  c$BarCol <- factor(c$b, levels = levels(c$b), labels = MyColours)

  p <- ggplot( c, aes(x=c$a, fill=c$b) ) + geom_histogram( binwidth=0.2 ) + 
    scale_fill_manual(values = c$BarCol, name = "X Intervals") + 
    scale_x_continuous( limits=c(2, 20))
}
plot (p)

1 个答案:

答案 0 :(得分:4)

drop系列中有scale_个参数表示空白级别:

NoOfElement <- 500; MyBreaks <- c(-Inf, seq(4, 16, by=2), Inf) 
MyColours <- c("black", "blue", "yellow", "green", "gray", "brown", "purple", "red")

set.seed(2) 
c <- data.frame(a=rnorm(NoOfElement, 10, 2), b=rep(NA, NoOfElement)) 
c$b <- cut(c$a, MyBreaks)

p <- ggplot( c, aes(x=c$a, fill=c$b) ) + geom_histogram( binwidth=0.2 ) + 
    scale_fill_manual(breaks = levels(c$b), values = MyColours, 
                      name = "X Intervals", drop=FALSE)

enter image description here

相关问题here